约束(完整性约束)是对更新表时的数据的约束,在更新表数据时,mysql会判断数据是否符合约束内容。

主键约束

创建表时定义列为primary key就是列的主键如果说要定义表的主键则需要在定义列的最后一条加上一句primary key(列名,...)

例如

  1. create table course
  2. (
  3. 学号 varchar(6) not null,
  4. 姓名 varchar(8) not null,
  5. 毕业日期 date not null,
  6. 课程号 varchar(3) ,
  7. 学分 tinyint ,
  8. primary key (学号, 课程号, 毕业日期) ->定义了一个复合主键,为表的主键
  9. );

主键规则:

1.每个表只能定义一个主键

2.关系模型理论要求每个表定义一个主键,然而MySQL可以创建没有主键的表

3.表中的两个不同的行在主键上不能有相同的值->例如学号不能相同

4.主键“最小化规则”->如果从复合主键中删除一个列,剩下的列仍然满足唯一性,那么这个复合主键不正确

5.一个列名在一个主键的列的列表中只能出现一次

例子:创建表的同时,主键同时命名索引

  1. create table course
  2. (
  3. 学号 varchar(6) not null,
  4. 姓名 varchar(8) not null,
  5. 毕业日期 date not null,
  6. 课程号 varchar(3),
  7. 学分 tinyint ,
  8. primary key index_course(学号, 课程号, 毕业日期)
  9. //->复合主键同时作为索引 index_course;
  10. );

唯一性约束

unique

在表xs1中将姓名列定义为一个唯一键。

  1. create table xs1
  2. (
  3. 学号 varchar(6) null,
  4. 姓名 varchar(8) not null unique,
  5. 出生日期 datetime null,
  6. primary key(学号)
  7. );
  8. 或者
  9. primary key(学号),
  10. unique(姓名)

唯一键和主键的区别

1.一个数据表只能创建一个主键,单一个表可以有若干个UNIQUE键,并且他们甚至可以重合

2.主键字段的值不允许为NULL,而UNIQUE字段的值可取NULL(只取一次),但是必须使用NULL或NOT NULL声明。

3.一般创建PRIMARY KEY约束时,系统会自动产生PRIMARY KEY索引。创建UNIQUE约束时,系统自动产生UNIQUE索引。

参照完整性约束(外键)

例如学生成绩中的所有学号必须存在于学生表的学号列中,这就是参照完整性约束。

外键被定义为表的完整性约束,包含了外键所参照的表和列,还可以声明参照动作

  1. REFERENCES 表名 [(索引列,...)]
  2. [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
  3. [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
  4. 其中索引列:
  5. 列名 [(长度)] [ASC|DESC]

ON DELETE | ON UPDATE : 可以为每个外建定义参照动作

动作语句:

RESTRICT: 拒绝对父表被参照列的删除或更新操作 (默认)

CASCADE: 从父表删除或更新行时自动 删除 或者 更新 子表中匹配的行

SET NULL: 从父表删除或更新行时。设置子表中与之对应的外键列为 NULL

NO ACCTION: 不采取动作 -> 同 RESTRICT

  1. create table xs1(
  2. 学号 varchar(6) null,
  3. 姓名 varchar(8) not null,
  4. 出生日期 datetime null,
  5. PRIMARY KEY(姓名), #主键:姓名
  6. FOREIGN KEY(学号) #外键:学号
  7. REFERENCES xs(学号) #对于xs表的参照完整性约束
  8. on delete restrict
  9. on update restrict
  10. );

在学生成绩表中创建学号外键

  1. alter table xs_kc
  2. add constraint fk_sno
  3. foreign key(学号)
  4. references xs(学号)

CHECK 约束

一些专用的约束,例如表中星期数要在1~7范围内,表中出生日期必须大雨1990-1-1 这样的例子就可以使用 CHECK约束(列级约束)

CHECK约束可以创建,但是不起作用

例 性别只能是男或者女

  1. create table student(
  2. 学号 char(6) not null,
  3. 性别 char(1) not null
  4. check(性别 in ('男''女')) #check 约束
  5. );

索引、约束例子(含默认)

!参照 索引-创建和删除索引

1.给课程表添加主键约束

  1. alter table kc
  2. add constraint pk_kc
  3. primary key (课程号)

2.给学生表添加唯一性约束

  1. alter table xs
  2. add constraint un_xm
  3. unique (姓名)

3.添加默认值(学分默认值为4)

  1. alter table kc
  2. alter column 学分
  3. set DEFAULT 4