1.主键约束
1.定义主键
主键就是表中的一列或多个列的一组,其值能唯一地标识表中的每一行。MySQL为主键列创建了唯一性索引,实现了数据的唯一性,在查询中使用主键时,该索引可用来对数据进行快速访问。MySQL通过定义PRIMARY KEY约束来创建主键,而且PRIMARYKEY约束中的列不能取空值。如果 PRIMARY KEY约束是由多列组合定义的,则某一列的值可以重复,但PRIMARY KEY约束定义中所有列的组合值必须唯一。
用户可以用两种方式定义主键,作为列或表的完整性约束,作为列的完整性约束时,只需在列定义的时候加上关键字PRIMARY KEY;作为表的完整性约束时,需要在语句最后加上一条 PRIMARY KEY(列名,.)语句。
创建表book_copy,将“书名”定义为主键。
CREATE TABLE book_copy
(
图书编号 varchar(6) NULL,
书名 varchar(20) NOT NULL PRIMARY KEY ,
出版日期 date
);
上面的表中主键定义于 NOT NULL之后,也可以在主键之后指定NOT NULL。如果作为主键的一部分的一个列没有定义为NOT NULL,MySQL就自动把这个列定义为NOT NULL。上面的表中的书名列可以没有NOT NULL声明,为了 楚起见,最好包含这个空指定。
当表中的主键为复合主键时,只能将其定义为表的完整性约束。
创建course表来记录每门课程的学生的“学号”“姓名”“课程号”“学分“毕业日期”。其中“学号”“课程号”“毕业日期”构成复合主键。
CREATE TABLE course
(
学号 varchar(6) NOT NULL,
姓名 varchar(8) NOT NULL,
毕业日期 date NOT NULL,
课程号 varchar(3),
学分 tinyint,
PRIMARY KEY (学号,课程号,毕业日期)
);
2.定义主键的原则
原则上,任何列或者列的组合都可以充当一个主键,但是主键列必须遵守一些规则。这些规则源于关系模型理论和MySQL所制定的规则。
(1)每个表必须定义一个主键
关系模型理论要求必须为每个表定义一个主键。然而,MySQL并不要求这样,它可以创建一个没有主键的表。但是,从安全角度考虑,应该为每个基础表指定一个主键。主要原因在于,没有主键,可能在一个表中存储两个相同的行,当两个行不能彼此区分时,查询过程中将会满足同样的条件,更新的时候也总是一起更新,这样容易造成数据库崩溃。
(2)唯一性规则
表中两个不同的行在主键上不能具有相同的值。(3)最小化规则
如果从一个复合主键中删除一列,而剩下的列构成的主键仍然满足唯一性原则,那么这个复合主键是不正确的。这条规则称为最小化规则,也就是说,复合主键不应该包含一个不必要的列。一个列名在一个主键的列表中只能出现一次。
MySQL自动地为主键创建一个索引,通常这个索引名为PRIMARY,用户可以重新给这个索引起名。
参照上列表中的course 表创建coursel表,将索引命名为“INDEX_course”。
CREATE TABLE coursel
(
学号 varchar(6) NOT NULL,
姓名 varchar(8) NOT NULL,
毕业日期 datetimeNOT NULL,
课程号 varchar (3),
学分 tinyint,
PRIMARY KEY INDEX_course(学号,课程号,毕业日期)
);
2.替代键约束
替代键像主键一样,是表的一列或一组列,它们的值在任何时候都是唯一的。因为一个表只能有一个主键,所以当一个表有多个列需要建立唯一性约束时,替代键是没有被选做主键的候选键。定义替代键的关键字是 UNIQUE。
在表 bookcopy1中,将“图书编号”作为主键,将“书名”列定义为一个替代键。
CREATE TABLE book_copy1
(
图书编号 varchar(20)NOT NULL,
书名varcha(20)NOT NULL UNIQUE,
出版目期 date NULL,
PRIMARY KEY(图书编号)
);
关键字 UNIQUE 表示“书名”是一个替代键,其列值必须是唯一的。):替代键也可以定义为表的完整性约束,上述语句也可以进行如下定义。
CREATE TABLE book copy1
(
图书编号varchar(20)NULL,
varchar(20)NOT NULL书名
出版日期 date NULL,
PRIMARY KEY(图书编号),
UNIQUE(书名)
);
在 MySQL中,替代键和主键的区别主要有以下几点。
(1)数量不同
一个数据表只能创建一个主键,但可以有若干个 UNIQUE键,并且它们甚至可以重合例如,在C1和C2列定义了一个替代键,并且在C2和C3列定义了另一个替代键,这两个替代键在C2列上重合,MySQL允许这样。
(2)NULL 设置不同
主键字段的值不允许为 NULL,而 UNIQUE 字段的值可取 NULL,但是必须使用 NULL或 NOT NULL 声明。
(3)索引不同
创建 PRIMARY KEY约束时,系统自动产生PRIMARY KEY索引。创建 UNIQUE 约束时,系统自动产生 UNIQUE索引。
对于已经创建好的表,可以使用ALTERTABLE语句向表中添加约束。语法格式如下
ALTER TABLE 表名
ADDPRIMARYKEY【列方式](列名) /*添加主键*/
IADD UNIQUE[系引名](列名,) /*添加替代键约束*/
|DROP PRIMARY KEY /*删除主键*/
IDROP INDEX引名 /*删除索引*/
假设 book 表中主键未设定,为 book 表建立主键约束为“图书编号”,“书名”为詞佷替代键约束。
ALTER TABLE Book
ADD PRIMARY KEY(图书编号),
ADD UNIQUE uidx(书名);
本例中既包括主键约束,也包括替代键约束,说明MySQL可以同时创建多个约束注意,使用PRIMARYKEY的列必须是一个具有NOTNULL属性的列。
删除 book 表中的主键和替代键约束。
ALTER TABLE Book
DROP PRIMARY KEY,
DROP INDEXuidx;