约束:表在设计的时候加入约束的目的是为了保证表中记录的完整和有效
约束分类:
- 主键约束: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) );
表创建后添加主键:
```sql
# 创建一个没有主键的表
create table [table_name] (
id int,
name varchar(10)
);
# 添加主键
alter table [table_name]
add constraint pk_table_name primary key (id);
# 或者省略constraint关键字
alter table [table_name]
add primary key (id);
删除主键约束:一般而言很少删除表的主键
# 通过约束名删除
alter table [table_name]
drop constraint pk_table_name;
# 在mysql中支持直接使用primary key进行删除
alter table [table_name]
drop primary key;
外键
外键是一列或一组列,用于强制两个表中的数据之间的链接。
- 在外键引用中,第一个表的主键列(或多个列)由第二个表的列(或列)引用,第二个表的列(或列)成为外键
- 在创建或更改表时,可以使用 foreign key 约束创建外键
创建外键语法:
constraint constraint_name
foreign key foreign_key_name (column1,...)
refernces parent_table(column1,...)
on delete action
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
# 唯一约束:列约束形式
create table [table_name] (
id int(10) primary key,
name varchar(25) unique
)
# 唯一约束:表约束形式
create table [table_name] (
id int(10) primary key,
name varchar(25),
# unique_name为unique约束名
constraint unique_name unique(name)
)
删除约束:
# 通过约束名删除
alter table [table_name]
drop constraint unique_name;
非空约束
用来 not null 约束的字段不能为 null 值,必须给定指定的数据
create table [table_name] (
id int primary key,
name varchar(25) not null
)
默认值约束
使用 default 给行添加默认值:
create table [table_name] (
id int(10) primary key,
name varchar(25) default ""
)
自增约束
auto_increment:自增,可以用在主键和非主键
create table [table_name] (
id int(10) primary key auto_increment,
name varchar(25) default ""
)