第3章_关系数据库标准语言(SQL)_004_数据表的创建和使用_001_数据表的创建(以及定义约束)
一. 创建数据表 ===》
1. Management Studio创建 ===》
右键单击"对象资源管理器"中"数据库"节点下的"表"节点,从快捷菜单中选择"新建表"命令,会弹出定义数据表结构对话框。其中,每一行用于定义数据表的一个字段,包括字段名、数据类型、长度、字段是否为NULL以及默认值等。
使用Management Studio创建数据表时重点的关注对象 ===》
--(1). 列名(即表中某个字段名): 由用户命名,最长128字符,可包含中文、英文、下划线、#号、货币符号(¥)及@符号。同一表中不允许有重名的列。
--(2). 数据类型: 定义字段可存放数据的类型。
--(3). 允许空: 当对某个字段的"允许空"列上打勾时,表示该字段的值允许为NULL值。这样,在向数据表中输入数据时,如果没有给该字段输入数据,系统将自动取NULL值,否则,必须给该字段提供数据。
--(4). 默认值: 表示该字段的默认值(即DEFAULT值)。如果规定了默认值,在向数据表中输入数据时,如果没有给该字段输入数据,系统自动将默认值写入该字段。
2. SQL命令创建 ===》
--(1). 基本语法:
create table <表名> (<列定义> [{, <列定义> | <表约束>}])
其中的<列定义>包括: <列名> <数据类型> [NULL | NOT NULL] [{, <列约束>}],关于约束我们放在第2大点详细介绍。
1st. "()"内表示可以有多个,但至少保证其中有一个;
2nd. "[]"内表示可以省略;
3rd. "{}"内表示可以有多个,并且可以省略,一般放在"[]"中;
--(2). 注意事项 ===》
1st. <表名>最多可有128个字符,不允许重名;
2nd. DEFAULT,若某字段设置有默认值,则当该字段未被输入数据时,以该默认值自动填入该字段;
二. 定义数据表的约束 ===》
完整性约束的基本语法格式: [constraint <约束名>] <约束类型>
1. DEFAULT: 为字段设置默认值;
基本语法为 ===》
DEFAULT 默认值 FOR 字段名 [WITH VALUES];
关于DEFAULT 和 NOT NULL的误解(WITH VALUES后面会谈到) ===》
situation_1: 当录入数据之前设置DEFAULT约束 ===》
1st. 新增一列只给定NOT NULL的列,没有给定DEFAULT约束。结果为: SUCCESS! ===>
ALTER TABLE 表名
ADD 字段名 字段数据类型 NOT NULL;
2nd. 新增一列给定NOT NULL并且具有DEFAULT约束的列。结果为: SUCCESS! ===>
ALTER TABLE 表名
ADD 字段名 字段数据类型 NOT NULL CONSTRAINT field_default_cons DEFAULT 默认值;
situation_2: 当录入数据之后设置DEFAULT约束 ===》
1st. 新增一列只给定NOT NULL的列,没有给定DEFAULT约束。结果为: FAILED! ===>
ALTER TABLE 表名
ADD 字段名 "传统"的字段数据类型 NOT NULL;
2nd. 新增一列给定NOT NULL并且具有DEFAULT约束的列。结果为: SUCCESS! ===>
ALTER TABLE 表名
ADD 字段名 "传统"的字段数据类型 NOT NULL CONSTRAINT field_default_cons DEFAULT 默认值;
两种情况的总结,以及WITH VALUES的作用 ===》
1st. 当数据表中没有数据是,可以指定数据的类型为NOT NULL,不必指定FEFAULT约束,只要录入的数据在该字段上不为NULL即可;
2nd. 当数据表中存在数据是,指定数据类型为NOT NULL时必须同时指定相应的DEFAULT约束,保证更新旧数据的该新增字段上的值为DEFAULT值;
3rd. 当然还有一点需要注意: 并不是有了DEFAULT约束,数据在该字段上的值就能不为NULL。且看此句Query Command ===》
ALTER TABLE 表名
ADD 字段名 "传统"的字段数据类型 CONSTRAINT field_default_cons DEFAULT 默认值;
当我们查看全部表内容: "SELECT * FROM 表名",便会看到,我们原有的数据在新建的列上的值为NULL,并不是我们所期待的DEFAULT值。想要让原有的数据得到更新,就必须加上NOT NULL,或者在此句的结尾加上: WITH VALUES。
2. UNIQUE: 指明基本表在某一列或多个列的组合上的取值必须唯一(候选码的唯一性)
基本语法为 ===》
1st. 用于对列进行约束: [constraint <约束名>] unique;
2nd. 用于对表进行约束: [constraint <约束名>] unique (<列名> [{, <列名>}]);
在建立UNIQUE约束时,需要考虑以下几个因素 ===》
1st. 使用UNIQUE约束的字段允许为NULL值;
2nd. 一个表中可以允许有多个UNIQUE约束;
3rd. UNIQUE约束用于强制在指定字段上创建一个UNIQUE索引,缺省为非聚集索引;
3. PRIMARY KEY: 用于定义基本表的主键,起唯一标识作用。
基本语法 ===》
1st. PRIMARY KEY用于定义列约束: [CONSTRAINT <约束名>] PRIMARY KEY;
2nd. PRIMARY KEY用于定义表约束: [CONSTRAINT <约束名>] PRIMARY KEY (<列名> [{, <列名>}]);
PRIMARY KEY与UNIQUE 的区别 ===》
1st. 在一个基本表中只能定义一个PRIMARY KEY约束,但可定义多个UNIQUE约束;
2nd. 对于指定为PRIMARY KEY的一个列或多个列的组合,其中任何一个列都不能出现NULL值,而对于UNIQUE所约束的唯一键,则允许为NULL;
3rd. 不能为同一个列或一组列,既定义UNIQUE约束,又定义PRIMARY KEY约束。
4. FOREIGN KEY用于定义表约束: [CONSTRAINT <约束名>] FOREIGN KEY (<列名> [{, <列名>}]) REFERENCES <主表名> (<列名> [{, <列名>}])
5. REFERENCES用于定义列约束: [CONSTRAINT <约束名>] REFERENCES <主表名> (<列名>)
6. CHECK: 用来检查字段值所允许的范围,在建立CHECK约束时,需要考虑以下几个因素 ===》
1st. 一个表中可以定义多个CHECK约束;
2nd. 每个字段只能定义一个CHECK约束;
3rd. 在多个字段上定义的CHECK约束必须为表约束;
4th. 当执行INSERT、UNDATE语句时,CHECK约束将验证数据;
基本语法: [CONSTRAINT <约束名>] CHECK (<条件>);