3.2.2 基本表的定义

3.2.2 基本表的定义

基本表是数据库中组织和管理数据的基本单位,数据库的数据保存在一个个基本表中。对于关系型数据库系统而言,其数据结构是关系,即由行和列构成的二维结构。

1)数据类型

关系模型中一个很重要的概念是域。每一个属性来自一个域,它的取值必须是域中的值。在SQL中域的概念用数据类型来实现。

SQL Server提供了多种数据类型供用户选择,主要包括数字数据类型、字符数据类型、日期和时间数据类型、二进制数据类型等,此外用户还可以自己定义数据类型。

(1)数字数据类型

数字数据类型(表3-4)主要用于存储数值,包括tinyint、smallint、int、bigint、float、real、decimal、numeric、money和smallmoney等。

表3-4 数字数据类型

tinyint、smallint、int、bigint是保存整数数据的精确数字数据类型。

decimal[(p[,s])]和numeric[(p[,s])]是保存带固定精度和小数位数的精确数字数据类型,p表示精度(Precision),定义了最多可以存储的十进制数字的总位数,包括小数点左、右两侧的位数,范围是1~38,默认精度为18;s(Scale)是小数点右侧可以存储的十进制数字的最大位数。当精度为1~9时,存储空间为5字节,当精度为10~19时,存储空间为9字节,当精度为20~28时,存储空间为13字节,当精度为29~38时,存储空间为17字节。

float和real是用于表示浮点数值数据的近似数字数据类型。float[(n)]中的n用于存储该数尾数的位数,SQL Server对于n只使用两个值,如果n的范围是1~24,SQL Server就使用24,如果n的范围是25~53,SQL Server就使用53,如果未指定n的值,即float(),n的值默认为53。real等价于float(24)。

money和smallmoney类型用来存储货币型数据,精确到它们所代表的货币单位的万分之一。货币型数据不需要使用单引号括起来,虽然可以指定前面带有货币符号的货币值,但SQL Server不存储任何与符号关联的货币信息,而是只存储数值。

(2)字符数据类型

字符数据类型(表3-5)用于存储各种字母、数字符号和特殊符号,使用时需用单引号将字符串括起来。常用的字符数据类型包括char、varchar、nchar、nvarchar、text、ntext等。

表3-5 字符数据类型

char和varchar类型用来存储ASCII编码的字符数据,它们的主要区别在于数据填充。假设有一个表的列名为name,且数据类型为varchar(10),此时将“Peter”存储到该列中,物理上只需存储5个字节。如果在数据类型为char(10)的列上同样存储“Peter”,则将使用全部的10个字节,SQL Server将在“Peter”后面插入半角空格来填充满10个字符,所以,称char为定长字符串,varchar为变长字符串。

nchar和nvarchar类型用于存储Unicode编码的字符数据,与ASCII编码方式不同,Unicode采用双字节编码方式,旨在涵盖全球所有语言的所有字符。例如,假设有一个需处理三种主要语言(中文、英语、法语)的客户数据库,采用Unicode字符数据,就无须使用不同代码页来处理不同字符集。因此,支持国际化客户端的数据库应始终使用Unicode数据类型,而不应使用非Unicode数据类型。nchar与nvarchar数据类型的填充方式与对等的char与varchar数据类型相同。

text与ntext数据类型用于在数据页外存储大量的ASCII编码或者Unicode编码的变长字符数据,比如很长的个人简历。另外,text与ntext数据类型在SQL Server的一些未来版本中将不可用,可以使用varchar(max)和nvarchar(max)。

建议使用char、nchar或varchar、nvarchar数据类型时:

如果列数据项的大小一致,则使用char、nchar;

如果列数据项的大小差异相当大,则使用varchar、nvarchar;

如果列数据项的大小相差很大,且字符串长度可能超过8000字节,则使用varchar (max)、nvarchar(max)。

(3)日期和时间数据类型

日期和时间数据类型(表3-6)主要包括date、datetime、samlldatetime、time等。其中,用户以单引号括起来的特定格式的字符串形式输入日期和时间类型数据,系统也以字符串形式输出日期和时间类型数据。

表3-6 日期时间数据类型

(4)二进制数据类型

二进制数据类型(表3-7)用于存储二进制数据,例如图形文件、Word文档或者MP3文件等,主要包括bit、image、binary、varbinary。

表3-7 二进制数据类型

(5)其他数据类型

除上述数据类型之外,SQL Server还提供了cursor、hierarchyid、table、uniqueidentifier、xml等数据类型(表3-8)。

表3-8 其他数据类型

2)SQL Server中的约束

在本书第2章的相关章节中曾介绍过关系模型的完整性约束:实体完整性约束、参照完整性约束、用户自定义的完整性约束。所谓的完整性是指数据库中数据的正确性、有效性和一致性(或相容性),用来防止数据库中存在不合法的数据。为了保证数据的完整性,SQL Server在创建基本表的时候就需要设置相应的约束。

Microsoft SQL Server是一款基于关系模型的数据库管理系统,本质上是对关系模型的实现,在SQL Server 2019中提供了以下几种约束,用以实现关系模型的实体完整性、参照完整性、用户自定义的完整性。

①主键约束(PRIMARY KEY):用于唯一地标识表中的各行,实现实体完整性。有主键约束的列上不能有重复值,也不能是NULL,它实际上是唯一性约束和非空约束的合并。一个表上只能有一个主键约束。

②唯一性约束(UNIQUE):有唯一性约束的列上不能有重复值,但可以是NULL。一个表上可以有多个唯一性约束。

③外键约束(FOREIGN KEY):有外键约束的列上的取值要参考被参照表中主键列或UNIQUE列上的取值,用于实现参照完整性。

④默认值约束(DEFAULT):在有默认值约束的列上输入数据时,如果没有指定该列的值,则系统自动用默认值赋予该列。

⑤空/非空约束(NULL/NOT NULL):如果表的某一列上有NULL约束,表示往表里插入数据时,可以省略该列的值。反之,如果表的某一列为NOT NULL,表示不允许在没有指定默认值约束的情况下省略该列的值。NULL不等于0,它对应现实世界的语义是不确定、不知道。

⑥检查约束(CHECK):用于实现用户自定义的完整性约束。比如约束成绩列的取值范围是[0-100],性别列上的取值只能是“男”或者“女”。

3)创建基本表

创建基本表的过程就是定义基本表结构(表中的列数,每列的属性名及类型、长度等)的过程,同时也可以定义各种完整性约束条件。SQL Server提供了两种方式创建表结构,一种是通过SQL Server Management Studio,另一种是使用CREATE TABLE定义表的结构。

(1)使用SQL Server Management Studio创建表

启动SQL Server Management Studio。

在左边的“对象资源管理器”窗口中展开“数据库”→“表”节点,单击鼠标右键,在出现的快捷菜单中选择“新建表”命令,如图3-13所示。

图3-13 “新建表”命令

在出现的表设计器窗口中,“列名”单元格中用于输入要创建的表的字段名,在同一行的“数据类型”单元格中为该列选择恰当的数据类型,并在“允许Null值”列选择是否允许该数据列为空值。如果允许,则选中复选框,如果不允许,则取消复选框。由于该表的“Sno”列是主键,选中Sno所在的行,单击工具栏上的按钮,即可将“Sno”设为主键,主键列不允许为空。设置完成后,“Sno”前面会有一个小钥匙图标,如图3-14所示。

图3-14 表设计器

重复以上步骤,为表添加“Sname”列,将“数据类型”设置为nvarchar(20),并设置允许为空。

重复以上步骤,为表添加“Ssex”列,将“数据类型”设置为nvarchar(2)。在表设计器的窗口中选中“Ssex”行,在窗口的下半部分显示“Ssex”列的属性。在“列属性”窗口的默认值或绑定选项中输入“男”作为默认值。默认值约束表示这一列没有提供值时,系统会自动给该数据类赋予一个默认设定好的值,如图3-15所示。

图3-15 设置默认值/绑定

选择“文件”→“保存”命令,或者单击工具栏上的保存按钮,在出现的对话框中输入新建表的名字,新表就会出现在SQL Server Management Studio的“对象资源管理器”中。

(2)使用CREATE TABLE创建表

其基本格式如下:

其中,

<column_constraint>用于定义列级完整性约束条件,表中该列的数据必须满足该约束,其展开形式如下:

<table_constraint>用于定义表级完整性约束条件,表级完整性约束为应用到多个列的完整性约束,其定义独立于列的定义,因此表级完整性约束定义时必须指出要约束的列的名称,并用逗号分隔各个表级约束,其展开形式如下:

说明:

database_name:要在其中创建表的数据库的名称;

schema_name:表所属的架构的名称;

table_name:要定义的基本表的名称;

column_name:组成该表的各个属性(列)的名称,必须唯一;

data_type:指定列的数据类型,可以是系统数据类型,也可以是用户定义的数据类型;

IDENTITY[(seed,increment)]:标识列,在表中添加新行时,数据库引擎将为该列提供一个唯一的增量值。标识列通常与PRIMARY KEY约束一起作用表的唯一行标识符,每个表只能创建一个标识列。seed是加载到表中的第一行所使用的值,increment是向加载的前一行的标识值中添加的增量值;

NULL|NOT NULL:确定列中是否允许使用空值;

CONSTRAINT:可选关键字,表示PRIMARY KEY、NOT NULL、UNIQUE、FOREIGN KEY或CHECK约束定义的开始。constraint_name是约束的名称,其名称必须在表所属的架构中唯一;

PRIMARY KEY:主键约束,通过唯一索引对给定的一列或多列强制实体完整性的约束,每个表只能创建一个PRIMARY KEY约束;

UNIQUE:唯一性约束,该约束通过唯一索引为一个或多个指定列提供实体完整性,一个表可以有多个UNIQUE约束;

CLUSTERED|NONCLUSTERED:指示为PRIMARY KEY或UNIQUE约束创建聚集索引还是非聚集索引。PRIMARY KEY约束默认为CLUSTERED,UNIQUE约束默认为NONCLUSTERED;

ASC|DESC:指定加入到表约束中的一列或多列的排列顺序,ASC为升序排列,DESC为降序排列,默认值为ASC;

FOREIGN KEY REFERENCES:为列中的数据提供参照完整性的约束。FOREIGN KEY约束要求列中的每个值在被参照的表中对应的被参照的列中都存在;

referenced_table_name:FOREIGN KEY约束所参照的表的名称;

ref_column:是FOREIGN KEY约束所参照的表中的一列或多列;

ON DELETE{NO ACTION|CASCADE|SETNULL|SETDEFAULT}:指定如果已创建表中的行具有引用关系,并且被引用行已从父表中删除,则对这些行所采取的操作。NO ACTION:禁止删除,CASCADE:级联删除,SETNULL:置空,SETDEFAULT:置为事先设定的默认值。默认选项为NO ACTION。有关该部分内容的详细介绍,请参阅本书6.2节数据库完整性控制;

ON UPDATE{NO ACTION|CASCADE|SETNULL|SETDEFAULT}:指定在发生更改的表中,如果行有引用关系且引用的行在父表中被更新,则对这些行所采取的操作。默认选项为NO ACTION。有关该部分内容的详细介绍,请参阅本书6.2节数据库完整性控制;

[DEFAULT<常量表达式>]:设置默认约束,默认值就是常量表达式的值。

CHECK:通过限制输入的一列或多列的可能值来实现域完整性。logical_expression 为返回TRUE或FALSE的逻辑表达式。

【例3.8】 创建学生表Student。

系统执行该CREATE TABLE语句后,就在当前数据库中建立一个新表Student,并将有关Student表的定义及有关约束条件存放在数据字典中。

【例3.9】 创建课程表Course。

本例中参照表和被参照表是同一个表。

【例3.10】 创建学生选课表SC。

4)修改基本表

在建立好基本表之后,有时需要对表的结构进行修改,包括对属性列的修改和对约束的修改。用户可以通过SQL Server Management Studio修改表结构,也可以使用ALTER TABLE语句修改表结构。

(1)使用SQL Server Management Studio修改表

启动SQL Server Management Studio。

在左边的“对象资源管理器”窗口中展开“数据库”→“表”节点,选中并右击需要修改的表,在出现的快捷菜单中选择“设计”命令,如图3-16所示。

图3-16 修改表

打开如图3-14所示的表设计器窗口,可以为表增加或删除列,修改已有列的列名、数据类型、约束等。

修改完毕后,单击工具栏上的保存按钮,可以将修改保存到表中。

(2)使用ALTER TABLE修改表的结构

其基本格式如下:

说明:

table_name:要修改的基本表的名称;

ADD子句:用于增加新的属性列、新的列级完整性约束条件或新的表级完整性约束条件;

<column_defination>|<table_contraint>:同CREATE TABLE中的<column_defination>|<table_contraint>;

DROP子句:用于删除表中的属性列或完整性约束条件;

ALTER子句:用于修改属性列。

【例3.11】 为学生表Student增加新的属性列:Scome(入学时间),其数据类型为DATE。

ALTER TABLE Student

ADD Scome DATE;

【例3.12】 修改学生表Student中属性列Scome的数据类型为DATETIME。

ALTER TABLE Student

ALTER COLUMN Scome DATETIME;

【例3.13】 去掉学生表Student中的属性列Scome。

ALTER TABLE Student

DROP COLUMN Scome;

5)删除基本表

当某个基本表不再需要时,用户可以通过SQL Server Management Studio删除表,也可以使用DROP TABL语句删除表。

(1)使用SQL Server Management Studio修改表

启动SQL Server Management Studio。

在左边的“对象资源管理器”窗口中展开“数据库”→“表”节点,选中并右击想要删除的表,在出现的快捷菜单中选择“删除”命令,如图3-17所示。

图3-17 删除表

在弹出的“删除对象”窗口中单击“确定”按钮,即可实现基本表的删除,如图3-18所示。

图3-18 删除对象对话框

(2)使用DROP TABLE语句将表删除

其基本格式如下:

注意:当一个基本表被删除后,该表的数据、在此表上所建立的索引、与该表关联的任何约束或触发器都将被自动删除,但建立在该表上的视图不会删除,系统将继续保留其定义,只是无法使用。

【例3.14】 删除例3.8、例3.9和例3.10中创建的表:Student、Course和SC。

DROP TABLE Student,Course,SC;