1. 主键约束
主键就是表中的一列或多个列的一组,其值能唯一地标志表中的每一行。通过定义PRIMARY KEY约束来创建主键,而且PRIMARY KEY约束中的列不能取空值。由于PRIMARY KEY约束能确保数据的唯一,所以经常用来定义标志列。当为表定义PRIMARY KEY约束时,MySQL为主键列创建唯一性索引,实现数据的唯一性,在查询中使用主键时,该索引可用来对数据进行快速访问。如果 PRIMARY KEY 约束是由多列组合定义的,则某一列的值可以重复,但PRIMARY KEY 约束定义中所有列的组合值必须唯一。
可以用两种方式定义主键:作为列或表的完整性约束。作为列的完整性约束时,只需在列定义的时候加上关键字PRIMARY KEY,作为表的完整性约束时,需要在语句最后加上一条PRIMARY KEY(col_name,…)语句。
例: 创建表XS1,将姓名定义为主键。
CREATE TABLE XS1(
学号 varchar(6) NULL,
姓名 varchar(8) NOT NULL PRIMARY KEY ,
出生日期 datetime ); www.2cto.com
说明:例中主键定义于空指定之后,空指定也可以在主键之后指定.
当表中的主键为复合主键时(即两个字段是主键时),只能定义为表的完整性约束。
例: 创建course表来记录每门课程的学生学号、姓名、课程号、学分和毕业日期。其中学号、课程号和毕业日期构成复合主键。
CREATE TABLE course(
学号 varchar(6) NOT NULL,
姓名 varchar(8) NOT NULL,
毕业日期 date NOTNULL,
课程号 varchar(3) ,
学分 tinyint ,
PRIMARY KEY (学号, 课程号, 毕业日期));
如果作为主键的一部分的一个列没有定义为NOT NULL,MySQL就自动把这个列定义为NOT NULL。实际上,在例中,可以忽略姓名列中的NOT NULL声明,但是为了清楚起见,最好包含这个空指定。
2. 原则上,任何列或者列的组合都可以充当一个主键。制定但是主键列必须遵守一些规则。这些规则源自于关系模型理论和MySQL所的规则:
(1)每个表只能定义一个主键。来自关系模型的这一规则也适用于MySQL。
(2)关系模型理论要求必须为每个表定义一个主键。然而,MySQL并不要求这样,可以创建一个没有主键的表。但是,从安全角度应该为每个基础表指定一个主键。主要原因在于,没有主键,可能在一个表中存储两个相同的行。因此,两个行不能彼此区分。在查询过程中,它们将会满足同样的条件,在更新的时候也总是一起更新,可能会导致
数据库崩溃。
(3)表中的两个不同的行在主键上不能具有相同的值。这就是唯一性规则。
(4)如果从一个复合主键中删除一列后,剩下的列构成主键仍然满足唯一性原则,那么,这个复合主键是不正确的,这条规则称为最小化规则(minimality rule)。也就是说,复合主键不应该包含一个不必要的列。
(5)一个列名在一个主键的列列表中只能出现一次。
MySQL自动地为主键创建一个索引。通常,这个索引名为PRIMARY。然而,可以重新给这个索引起名。
例: 创建例5.9中的course表,把主键创建的索引命名为INDEX_course。
www.2cto.com
CREATE TABLE course(
学号 varchar(6) NOT NULL,
姓名 varchar(8) NOT NULL,
学分 tinyint ,
PRIMARY KEY INDEX_course(学号, 课程号));
3. 替代键约束(unique)
在关系模型中,替代键像主键一样,是表的一列或一组列,它们的值在任何时候都是唯一的。替代键是没有被选做主键的候选键。定义替代键的关键字是UNIQUE。
例: 在表XS1中将姓名列定义为一个替代键。
CREATE TABLE XS1(
学号 varchar(6) NULL,
姓名 varchar(8) NOT NULLUNIQUE,
出生日期 datetime NULL,
PRIMARY KEY(学号));
说明:关键字UNIQUE表示“姓名”是一个替代键,其列值必须是唯一的。
替代键也可以定义为表的完整性约束,前面语句可以这样定义:
CREATE TABLE XS1(
学号 varchar(6) NULL,
姓名 varchar(8) NOTNULL,
出生日期 datetime NULL,
PRIMARY KEY(学号),
UNIQUE(姓名));
4.在MySQL中替代键和主键的区别主要有以下几点。
(1)一个数据表只能创建一个主键。但一个表可以有若干个UNIQUE键,并且它们甚至可以重合,例如,在C1和C2列上定义了一个替代键,并且在C2和C3上定义了另一个替代键,这两个替代键在C2列上重合了,而MySQL允许这样。 www.2cto.com
(2)主键字段的值不允许为NULL,而UNIQUE字段的值可取NULL,但是必须使用NULL或NOTNULL声明。
(3)一般创建PRIMARY KEY约束时,
系统会自动产生PRIMARY KEY索引。创建UNIQUE约束时,系统自动产生UNIQUE索引。
通过PRIMERY KEY约束和UNIQUE约束可以实现表的所谓实体完整性约束。定义为PRIMERY KEY和UNIQUE KEY的列上都不允许出现的值。
5.外键(foreign)
参照完整性约束(referential integrity constraint)是一种特殊的完整性约束,实现为一个外键。所以XS_KC表中的学号列和课程号列都可以定义为一个外键。可以在创建表或修改表时定义一个外键声明。
定义外键的语法格式已经在介绍索引时给出了,这里列出reference_definition的定义。语法格式如下:
REFERENCES tbl_name [(index_col_name,...)]
[ON DELETE {RESTRICT | CASCADE |SET NULL | NO ACTION}]
[ON UPDATE {RESTRICT | CASCADE |SET NULL | NO ACTION}]
说明:外键被定义为表的完整性约束,reference_definition中包