当前位置: 代码网 > it编程>数据库>Mysql > 外键约束RESTRICT和NO ACTION有何不同?MySQL外键详解

外键约束RESTRICT和NO ACTION有何不同?MySQL外键详解

2026年07月25日 Mysql 我要评论
一、建立外键约束语法如下:[constraint [symbol]] foreign key [index_name] (col_name, ...) references tbl_name (col

一、建立外键约束

语法如下:

[constraint [symbol]] foreign key
 [index_name] (col_name, ...)
 references tbl_name (col_name,...)
 [on delete reference_option]
 [on update reference_option]
reference_option:
 restrict | cascade | set null | no action | set default

1. constraint [symbol]]指定约束名字,不写则系统自动生成外键约束名;

2. mysql强制外键约束的列上必须要有索引, [index_name]指定索引名,不写则系统自动生成索引名,如果已经存在可以用于支持外键约束的索引,那么指定的索引名则无效,采用已有的索引;

3. [on delete reference_option][on update reference_option]指定主表update和delete操作时,子表对应的数据怎么响应;

建立外键约束例子如:

create table tab1 (id int primary key);
create table tab2 (
id int primary key,
col1 int,
foreign key (col1)
references tab1(id)
);

下面看一下[on delete reference_option][on update reference_option]reference_option都有哪些参数:

1.cascade,级联删除/级联更新,即主表delete或update了被其他表引用的数据,对应子表的数据也被delte或update;

2.set null,当主表delete或update了被其他表引用的数据,对应子表的数据被设为null,注意子表的外键不能设为not null;

3.restrict,主表不允许delete或update被其他表引用的数据;当没有指定任何[on delete reference_option][on update reference_option],默认是采用restrict;

4.no action,在mysql中,等效于restrict;

5.set default,innodb和ndb中无法使用该参数。

二、添加外键约束

语法如下:

alter table tbl_name
 add [constraint [symbol]] foreign key
 [index_name] (col_name, ...)
 references tbl_name (col_name,...)
 [on delete reference_option]
 [on update reference_option]

基本的语法参数在上文已经解释了。

三、删除外键约束

语法如下:

alter table tbl_name drop foreign key fk_symbol;

fk_symbol即外键约束名,如果不知道具体是什么,可以使用show create table tab_name\g来查看。

四、外键约束注意事项

1.外键上无法插入主表没有的数据,也无法更新为主表没有的数据;

2.外键上必须要有索引,主表上对应的列最好也创建索引,因为当子表外键插入数据时,也是需要到主表对应的列上去检查数据是否存在,有索引可以提高效率;

3.如果一个表被其他表的外键引用,则这个表无法被删除;如果通过set foreign_key_checks=0强制删除主表,则子表无法插入任何数据;

4.外键的字段类型,字符集必须要跟引用的字段一致,unsigned属性也要一致,否则无法创建外键约束;

5.被引用的列上必须要有索引,否则无法创建外键约束。

五、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com