约束:表在设计的时候加入约束的目的是为了保证表中记录的完整和有效

约束分类:

  • 主键约束:primary key
  • 外键约束:foreign key
  • 唯一约束:unique,
  • 非空约束:not null
  • 默认值约束:default,
  • 自增约束:auto_increment
  • 检查约束:MySQL 不支持

注意:一个表有且只能有一个主键约束,允许存在多个其他约束

主键约束

表由列和行组成。 通常,表具有一列或多列,列的值唯一地标识表中的每一行。 此列或多列称为主键。由两列或更多列组成的主键也称为复合主键。

主键特性:

  • 主键不接受 NULL 或重复值
  • 如果主键由两列或更多列组成,则值允许在某一列中重复,但主键中的所有列的组合必须是唯一的

在创建表时定义主键:

  • 如果主键是由一列组成,则可以使用 primary key 约束作为列或表约束
  • 如果主键由两列或更多列组成,则必须使用 primary key 约束作为表约束 ```sql

    单列主键,列约束

    create table user( id int primary key, name varchar(20) );

单列主键,表约束

create table user( id int, name varchar(20), constraint id primary key (id) );

多列主键:由id和name组成

create table user( id int, name varchar(20), constraint id_name primary key (id ,name) );

  1. 表创建后添加主键:
  2. ```sql
  3. # 创建一个没有主键的表
  4. create table [table_name] (
  5. id int,
  6. name varchar(10)
  7. );
  8. # 添加主键
  9. alter table [table_name]
  10. add constraint pk_table_name primary key (id);
  11. # 或者省略constraint关键字
  12. alter table [table_name]
  13. add primary key (id);

删除主键约束:一般而言很少删除表的主键

  1. # 通过约束名删除
  2. alter table [table_name]
  3. drop constraint pk_table_name;
  4. # 在mysql中支持直接使用primary key进行删除
  5. alter table [table_name]
  6. drop primary key;

外键

外键是一列或一组列,用于强制两个表中的数据之间的链接。

  • 在外键引用中,第一个表的主键列(或多个列)由第二个表的列(或列)引用,第二个表的列(或列)成为外键
  • 在创建或更改表时,可以使用 foreign key 约束创建外键

创建外键语法:

  1. constraint constraint_name
  2. foreign key foreign_key_name (column1,...)
  3. refernces parent_table(column1,...)
  4. on delete action
  5. on update action
  • constraint 子句定义外键约束定义约束名称,如果省略,MySQL 将自动生成一个名称
  • foreign key 子句指定子表中引用父表中主键列的列
  • references 子句指定父表及其子表中列的引用,在 foreign key 和 references 中指定的子表和父表中的列数必须相同
  • on delete :允许定义当父表中的记录被删除时,子表的记录怎样执行操作,如果省略 on delete 子句并删除父表中的记录,则 MySQL 将拒绝删除子表中相关联的数据
    • on delete cascade:当删除父表中的记录时,MySQL可以删除子表中引用父表中记录的记录
    • on delete set null:当父表中的记录被删除时,MySQL 会将子表中的外键列值设置为 NULL,条件是子表中的外键列必须接受 NULL 值
    • on delete no action / on delete restrict:MySQL 拒绝任何更新
  • on update :允许定义父表中的记录被更新时,子表的记录怎样执行操作

删除外键:alter table table_name drop foreign key constraint_name
获取生成表的约束名称:show create table table_name

MySQL 禁用外键检查:

  • 如果不禁用外键检查,则必须以正确的顺序加载数据,即必须首先将数据加载到父表中,然后再将数据加载导入到子表中,这可能是乏味的。 但是,如果禁用外键检查,则可以按任何顺序加载导入数据
  • 除非禁用外键检查,否则不能删除由外键约束引用的表。删除表时,还会删除为表定义的任何约束

禁用外键检查:set foreign_key_checks = 0;
启用外键检查:set foreign_key_checks = 1;

唯一约束

unique :指定 table 的列或列组合不能重复,保证数据的唯一性,但可以为 null

  1. # 唯一约束:列约束形式
  2. create table [table_name] (
  3. id int(10) primary key,
  4. name varchar(25) unique
  5. )
  6. # 唯一约束:表约束形式
  7. create table [table_name] (
  8. id int(10) primary key,
  9. name varchar(25),
  10. # unique_name为unique约束名
  11. constraint unique_name unique(name)
  12. )

删除约束:

  1. # 通过约束名删除
  2. alter table [table_name]
  3. drop constraint unique_name;

非空约束

用来 not null 约束的字段不能为 null 值,必须给定指定的数据

  1. create table [table_name] (
  2. id int primary key,
  3. name varchar(25) not null
  4. )

默认值约束

使用 default 给行添加默认值:

  1. create table [table_name] (
  2. id int(10) primary key,
  3. name varchar(25) default ""
  4. )

自增约束

auto_increment:自增,可以用在主键和非主键

  1. create table [table_name] (
  2. id int(10) primary key auto_increment,
  3. name varchar(25) default ""
  4. )