数据库本身无法直接存储数据,存储数据是通过数据库中的表来实现的。
2.1 表相关的几个基本概念
在创建和管理数据库表之前,需要理解以下几个概念。
2.1.1 数据完整性
数据完整性是要求数据库中的数据具有准确性,准确性是通过数据库表的设计和约束来实现的。例如:在存储学生信息的表中,如果允许任意输入学员信息的话,则在同一张表中可能重复出现一个学员的信息;还有如果不对表中存储的年龄信息加以限制,则学员出现的年龄可能出现负数,这样的数据都不具备完整性。
为了实现完整性,数据库需要做以下两方面的工作。
检验每行数据是否符合要求。
检验每列数据是否符合要求。
为实现以上要求,SQL Server提供了以下4种类型的约束(Constraint)。
1. 实体完整性约束
实体完整性要求表中的每一行数据都反映不同的实体,不能存在相同的数据行。
通过索引、唯一约束、逐渐约束或标识列属性,可以实现表的实体完整性。
2. 域完整性约束
域完整性是指给定列的输入有效性。
通过限制数据类型、检查约束、输入格式、外键约束、默认值、非空约束等多种方法,可以实现表的域完整性。
3. 引用完整性约束
在输入或删除数据行时,引用完整性约束用来保持表之间已定义的关系。
例如:在管理学员信息的时候,一个表用来存储学员的信息,一个表用来存储考试成绩的详细情况,并且考试成绩表中的一列数值就是学员信息表中的编号,用来表示是哪个学员的考试。
可以看出两张表建立了“关系”,学员信息表是“主表”,学员成绩表是“子表”(有时也叫做“相关表”)。
在强制引用完整性时,SQL Server 禁止用户进行下列操作。
当主表中没有关联的记录时,将记录添加到相关表中。也就是说学员成绩表中不能够出现在学员信息表中不存在的学号。
更改主表中的值并导致相关表中的记录孤立。如果学员信息表中的学号改变了,学员成绩表中的学号也应当随之改变。
从主表中删除记录,但仍存在与该记录匹配的相关记录。如果把学员信息表中的学员删除了,则该学员的学号不能出现在学员成绩表中。
引用完整性通过逐渐和外键之间的引号关系来实现。
4. 自定义完整性约束
用户自定义完整性用来定义特定的规则,例如,在向用户信息表中插入一个用户记录时,要求通过身份证编号来检查在另外一个数据库中是否存在该用户,并且该用户的信誉度是否满足要求等。如果不满足要求则不能够插入,这个时候就需要使用数据库的规则、存储过程或者触发器对象来进行约束。
2.1.2 主键(Primary Key)和外键(Foreign Key)
1. 主键
如果在表中存储了很多行数据,就会引发这样的问题:如果判断表中没有重复的数据行?
如果判断一个学员的信息没有被录入两次?
这就需要有一个列,这个列中不同的值能够表示这一行数据属于不同的实体。
表中有一列或几列组合的值能用来唯一地表示不同的学员,因此可以把该列设置为主键。该列设置为主键以后,就不能再输入重复的用户编号。
一个表只能有一个主键,主键约束确保了表中的行是唯一的;尽管表中可以没有主键,但是通常情况下应当为表设置一列为主键。(如果两列或多列组合起来唯一标识表中的每一行,则该主键也叫做“组合键”。)
有时候,在同一张表中,有多个列可以用来当作主键。在选择哪个列作为主键的时候,需要考虑以下两个原则:最少性和稳定性。
最少性是指列数最少的键,如果可以从单个主键和组合主键中选择时,应该选择单个主键。这是因为操作一列比操作多列要快。当然该规则也有例外,例如:两个整数类型的列的组合比一个很大的字符类型的列要快。
稳定性是指列中数据的特征,由于主键通常用来在两个表之间建立联系,所以主键的数据不要经常更新,理想情况下,应该永远不改变。
2. 外键
一般情况下,学员的信息和学员的考试成绩是存放在不同的数据表中的。在成绩表中,可以存储一行学员的编号来表示是哪个学员的考试成绩,这时又引发了一个问题:如果在成绩表中输入的学号根本不存在(例如录入的时候把学号写错了),该怎么办?
这个时候,就应当建立一种“引号”的关系,确保“子表”中的某个数据项在“主表”中必须存在,避免以上错误发生。
“外键”就是用来达到这个目的的,它是对应于主键而言的,就是“子表”中对应于主键而言的,就是“子表”中对应于“主表”的列,在子表中称为外键或者引用键,它的值要求与主表的主键或者唯一键相对应,外键用来强制引用完整性。
明确了完整性规则之后,就可以创建数据库表了,创建数据库表实际上就是实施不同的约束,实现完整性规则的过程。
一个表可以有多个外键。
2.2 建立数据库表
在SQL Server Management Studio 中可以创建数据库的表,以下进行详细的说明。
2.2.1 在SQL Server Management Studio中建立数据库表
在SQL Server Management Studio 中,单击数据库下的“表”节点,将显示该数据库所有的表。与上一章介绍的数据库类似,数据库表也分为系统表和用户表。系统表是创建数据库的时候自动生成的,并用来保存数据库自身的信息。
用户表存储用户自定义的数据,下面首先来看看如何创建用户表。
选择并右击数据库下的“表”选项,然后在快捷菜单中选择“新建表”选项,这样就可以在右侧的区域中输入和定义表的不同列。
除了输入列的名称之外,还需要确定该列的数据类型,因此,首先需要对SQL Server提供的数据类型有所了解。
2.2.2 确定列的数据类型
图中列出了SQL Server中常用的数据类型。
分类 | 备注和说明 | 数据类型 | 说明 |
二进制数据类型 | 用来存储非字符和文本的数据 | binary | 固定长度的二进制数据 |
varbinary | 可变长度的二进制数据 | ||
image | 可用来存储图像 | ||
文本数据类型 | 字符数据包括任意字母、符号和数字字符的组合 | char | 固定长度的非Unicode字符数据,最大长度8000个字符 |
varchar | 可变长度的非Unicode数据 | ||
nchar | 固定长度的Unicode数据 | ||
nvarchar | 可变长度的Unicode数据 | ||
text | 存储长文本信息 | ||
ntext | 存储可变长度的长文本 | ||
日期和时间 | 日期和时间在单引号内分别输入 | datetime | 日期和时间 |
数字类型 | 该数据仅包含数字,包括正数、负数以及分数 | int smallint tinyint bigint |
整数 |
float real |
浮点数 | ||
货币数据类型 | 货币数据类型用于十进制货币值,并且精确到小数点后4位数字 | Money | |
Bit数据类型 | 表示是/否的数据,只有两种选择;如婚否、是否定购等。在SQL Server中用1和0表示,一般1表示是,0表示否 | Bit | 存储布尔数据类型 |
Unicode标准为全球商业领域中广泛使用的大部分字符定义了一个单一编码方案,它通过两字节来进行编码,使得不同语言在不同的计算机上的编码方式都是一样的,因此都能够被编译和识别。
例如:对于存储用户信息的表有如下说明。
姓名、地址、电话号码等信息一般使用字符数据类型存储。
性别(男/女)一般使用Bit数据类型存储。
年龄信息一般使用日期数据类型存储。
照片使用Image数据类型存储。
薪水使用货币数据类型存储。
在创建表的时候,选择字符数据类型,还需要输入长度信息,选择数字数据类型不再需要输入长度信息,因为其长度是固定的。
2.2.3 是否允许为空值
数据库的列是否允许为空也是一种约束。如果该列允许为空,则在输入数据行的时候,这一项可以不输入。
列是否允许为空跟具体的要求相关,例如一些学员有E-mail地址,而另外一些学员没有E-mail地址,这一项就应当允许为空;而重要的,不可或缺的信息,例如姓名,就不应该允许为空。
2.2.4 建立主键
确定了列的名称、数据类型和允许为空之后,表的基本框架就完成了。
建立主键的方法比较简单,首先选择要建立主键的列,单击右键,然后在快捷菜单中选择“设置主键”选项就可以了。
设置该列为主键以后,该列上有个钥匙图案进行标识。
2.2.5 默认值
有时候,对某项数据进行输入的时候,它总是存在一个默认值,例如女子学院中的学生,学生的性别通常应该是“女”(除非有特殊情况)。教师的级别如果不输入,默认值可以为“讲师”。
表的默认值设置能够定义一个值,每当用户没有在某一列中输入值时,则将所定义的值提供给这一列。
学员地址列可以在表的下方定义默认值为“北京女子职业技术学校”,这一列在不另外输入地址的情况下,都统一是该地址。
2.2.6 标识列
在很多情况下,存储的信息中很难找到不重复的信息作为列的主键。就拿学员信息表来说,以姓名作为主键的话,一个班上就不允许有同名的学员。如果一张表存储整个学校的学员信息,那么整个学校的学生都不允许重名,这显然要带来麻烦。
SQL Server 提供了一个“标识列”,特意对列进行区分,标识列本身没有具体的意义,不反映学员诸如地址、性别这样的信息,只是用来区别不同的学员。
标识列的实现方式如下。
(1)如果一列的数据属于数字类型(例如整数),则可以把该列定义为标识列。
(2)定义成标识列之后,还需要分别指定“标识种子”和“标识递增量”,默认值都是1。
(3)定义了标识列之后,在以后每次输入数据的时候,该列随数据行的增加而自动增加数字,并且不会重复,第一次的数字就是“标识种子”值,以后每次按照“标识递增量”增加数值。
标识列通常也被定义为主键,通常所说的“自动编号”就是指标识列的数字自动增加。
标识列中的数据是自动生成的,不能在该列上输入数据,使用SQL语句插入数据时,也不能为标识列指定值。
2.3 建立表间关系
建立表间关系实际上就是实施引用完整性约束,建立主表和子表关系。
如果已经建立了学员信息表(Students)和成绩表(Score),成绩表中的字段StudentID引用了学员信息表中的字段SCode,因此,学员信息表是主表,成绩表是子表。
在SQL Server Management Studio中,可以按照以下的步骤建立这两张表之间的关系。
(1)在设计表的时候,在Score表中右键菜单中选择“关系”选项,将显示“外键关系”对话框,单击“添加”按钮可以添加新的关系。
(2)单击“表和列规范”最右侧的小按钮,将显示要建立关系的主键表以及主键列对话框。
(3)选择主表为Students,主键字段为Code,对应的外键表Score的字段为StudentID、
单击“确定”按钮,并保存表结构,这样他们之间的主-外键关系就建立了。
要查看表之间的关系,可以在数据库中选择“数据库关系图”选项,然后根据提示信息新建数据库关系图,在向导的第二步中选择要显示关系的表。
2.4 建立检查约束
检查约束也叫做CHECK约束,用于定义列中可接受的数据值或者格式,例如成绩表中的成绩数值应当为0-100,学员信息表中的E-mail地址之中应当包括一个@符号等。如果不满足上述要求,则判断其是不合法的数据,不允许输入。
在SQL Server中,可以编写检查约束的代码来实现以上的要求。
对于成绩表中成绩的约束设计,在设计表的时候,在快捷菜单中选择“CHECK约束”选项,然后在“CHECK约束”对话框中单击“添加”按钮,将添加一个新的约束。
单击“表达式”最右侧的小按钮,可以在弹出的“CHECK约束表达式”对话框中输入以下的表达式:
0 单击“确定”按钮后保存表,该约束建立。以后在向表中输入、插入或者更新数据的时候,约束将起作用,如果在Score列输入的数值小于等于0或者大于等于100,都将出现错误报告。 同样,建立学员信息表对邮件地址的约束来检查输入格式是否有效,步骤是一样的,只是约束表达式不一样。 Email LIKE '%@%' 其中,%代表任意多个字符。 关闭后保存学员信息表,该约束将建立。以后在向表中输入、插入或者更新数据的时候,约束将起作用,如果在Email输入的字符中不包括@,将出现错误报告。 2.5 导入和导出数据(注:本案例为sql 2005) 有时候,需要把存储在数据库中的数据导出保存成文本文件或者Excel文件,或者把文本文件、Excel中的数据导入到数据库表中,这个时候就需要用到数据库的导入/导出向导。 导入/导出向导实际上不仅仅可以完成数据库和文件格式的格式转换,还可以在不同的数据库之间进行数据传输,下面是把数据库XXX表XX中的数据导出,并保存为文本文件,步骤如下。 (1)在数据库右键菜单中选择“任务”->“导出数据”选项。 (2)选择要从何处取得数据,这个时候可以选择SQL Server自身,并在下面选择XX数据库。 (3)确定把数据导出到什么位置,这时候可以在上方的目标列表框中选择“平面文件目标”选项,然后在下方输入文件的名称,并确定文件相关的选项。 (4)选择是否用一条查询语句进行复制,单击“下一步”按钮。 (5)选择表名并设置文本文件的格式。 在界面上选择XXX,设置每一行采用回车换行来分隔,每一列采用Tab键来分隔。 (6)确定是否立即运行,是否保存该转换设置,单击“下一步”按钮一直到完成转换。 2.6 删除表 对于不再使用的数据表,可以删除以释放磁盘文件,选择该表,在快捷菜单中选择“删除”选项可以把该表直接删除。 对于建立主外键关系的表,如果要删除主表,则首先要删除相关的子表以保证数据的引用完整性。例如要删除上面建立的学员信息表Students,如果子表Score没有被删除,将报告错误信息。 删除表一定要慎重,不然会造成有用的数据丢失。