sql 约束(constraints) on update cascade 和 on delete cascade 作用区别?
sql 约束(constraints)
在 sql 中,我们有如下约束:
not null - 指示某列不能存储 null 值。
unique - 保证某列的每行必须有唯一的值。
primary key - not null 和 unique 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
foreign key - 保证一个表中的数据匹配另一个表中的值的参照完整性。
check - 保证列中的值符合指定的条件。
default - 规定没有给列赋值时的默认值。
这是数据库外键 foregin references 定义的一个可选项,用来设置当主键表中的被参考列的数据发生变化时,外键表中响应字段的变换规则的。update 则是主键表中被参考字段的值更新,delete 是指在主键表中删除一条记录:
on update 和 on delete 后面可以跟的词语有四个 [no action , set null , set default ,cascade]
no action 表示 不做任何操作,
set null 表示在外键表中将相应字段设置为 null
set default 表示设置为默认值
cascade 表示级联操作,就是说,如果主键表中被参考字段更新,外键表中也更新,主键表中的记录被删除,外键表中改行也相应删除
- 如果 linecenter(主表)中的一个 lid 被删除了,那么引用该 id 的从表中的所有记录也被删除。
通常称为级联删除
一. 关系型数据库
市场上主流的关系型数据库:oracle、db2、sybase 、postgresql、microsoft sql server、microsoft access、mysql。
关系型数据库有三大完整性:
实体完整性:实体属性中的标识属性不能为空、不能重复,该约束通过制定的主键实现,其约束有系统强制实施
参照完整性:实体中的外键可以为空,但不能是错的。
用户定义完整性:某一具体的实际数据库的约束条件,由应用环境所决定,反映某一具体应用所涉及的数据必须满足的要求。(例如定义某一行不能为空)
约束主要完成对数据的检验和限制,从而保证数据库的完整性。
二.约束
1.主键约束(primary key)
主键约束列不允许重复,即任意两行的主键值都不相同;每行都具有一个主键值,也不允许出现空值;
单列主键
创建有两种方式:
一种是直接对字段加primary key关键字:
create table student(
id int primary key,
name varchar(20),
)
另外一种是通过额外加约束的方式:
create table student(
id int not null,
name varchar(20),
constraint pk_id primary key(id) //pk_id为约束的名字
)
联合主键
有时候一个列的字段可能有重复,可以联合多个列设为主键。
create table student(
name varchar(20),
class varchar(20),
constraint pk_name_class primary key(name,class)
)
其它操作
//删除主键约束
alter table 表名 drop primary key;
//添加主键
alter table 表名 add primary key(列名);
//修改列为主键
alter table 表名 modify 列名 数据类型 primary key;
2.外键约束(foreign key)
外键约束是保证一个或两个表之间的参照完整性,保持数据一致性。表的外键可以是另一表的主键(也可以是唯一索引,详情看这里), 外键可以有重复的, 可以是空值。实现一对一或一对多关系。
创建外键约束
create table classes(
id int auto_increment primary key,
name varchar(20)
);
//第一种:添加关键字
create table student(
id int auto_increment,
name varchar(20),
constraint pk_id primary key(id),
class_id int references classes(id)
)
//第二种:额外声明
create table student(
id int auto_increment,
name varchar(20),
constraint pk_id primary key(id),
class_id int,
constraint fk_class_id foreign key(classe_id) references classes(id)
)
外键约束的要求
父表和子表必须使用相同的存储引擎,而且禁止使用临时表
数据表的存储引擎只能为innodb,default-storage-engine-innodb
外键列和参照列必须具有相似的数据类型,数字的长度或是有符号位必须相同,而字符 的长度可以不同
外键列和参照列必须创建索引,如果外键列不存在索引的话,mysql将自动创建索引。
设定参照列:foreign key(id) peferences provinces(id)
外键约束的参照操作
cascade:从父表删除或更新且自动删除或更新子表中匹配的行
set null:从父表删除或更新行,并设置子表中的外键列为null,如果使用该选项,必须保证子表列没有指定not null
restrict:拒绝对父表的删除或更新操作
no action:标准sql的关键字,在mysql中与restrict相同
其它操作
//删除外键约束
alter table 表名 drop foreign key 外键约束名;
(创建外键的方法没有指定约束名称,系统会默认给外键约束分配外键约束名称,命名为student_ibfk_n)
//增加外键约束
alter table 表名 add foreign key 列名 references 父表(对应列名);
3.唯一约束(unique)
指定表中某一列或多个列不能有相同的两行或者两行以上的数据存在,
唯一约束可以保证记录的唯一性
唯一约束的字段可以为空值(允许的空值有多个,但是最终存储的只有一个)
每张数据表可以存在多个唯一约束
unique key的用途:主要是用来防止数据插入的时候重复。
create table student
(
name char(20) unique key
);
为表中列添加unique key
alter table student modify char(20) unique key;
4.非空约束(not null)
输入值必须是非空的,需要注意的是允许控制尽量不要太多,太多会更消耗数据库性能。
create table student
(
name char(20) not null
);
5.默认约束(default)
默认约束有以下的要求:
定义的常量必须与该列的数据类型、精度等匹配
每个列只能定义一个default约束
default约束会在使用insert语句
这里需要说明的是,default后面不能像sql server那样使用函数,后面只能是一个常量。官方文档原文:
with one exception, the default value must be a constant; it cannot be a function or an expression.
如果我们想要获取当前的时间,可以使用current_timestamp
create table student
(
jointime datetime default current_timestamp
);
6.check约束
check约束,验证数据,比如性别中只能为女或男,而不能为其它。mysql不支持check约束,但可以使用check约束,就是没有任何效果。
三.参考资料
《大话数据库》
mysql 5.7 reference manual
set now() as default value for datetime datatype?
imooc课程:《与mysql的零距离接触》