举例:
drop table if exists t1
drop table if exists t2
create table t1(id int primary key , s1 float)
create table t2(id int , id1 int ,s1 float,foreign key(id1) references t1(id) )
insert into t1 values(1,20)
insert into t1 values(2,30)
insert into t2 values(1,1,50)
--如果你直接删除t1的数据,则物塌报错
delete t1
692: Key value for constraint (root.u143_565) is still being referenced.
Error in line 1
Near character position 8
--需要先删除t2表中的数据,才能删除t1表中的数据
delete t2
delete t1
2、可以卖竖通过外键设置级联删除
--在设置外中蚂大键时,设置级联删除
drop table t2
drop table t1
create table t1(id int primary key , s1 float)
create table t2(id int , id1 int ,s1 float,foreign key(id1) references t1(id) on delete cascade)
insert into t1 values(1,20)
insert into t1 values(2,30)
insert into t2 values(1,1,50)
--此时删除t1的数据,则删除t1及t2中数据
>delete t1
2 row(s) deleted.
>select * from t2
idid1s1
No rows found.
先看On Delete属性,可能取值为:No Action, Cascade,Set Null, Restrict属性。当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除。
当取渗念值为Cascade时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则也删除外键在子表(即包含外键的表)中的记录。
当取值为Set Null时,则当在父表(即外键的来源御瞎表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。
当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许更新。
当取值为Cascade时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则也更新外键在子表(即包含外键的表)中的记录。
当取值为Set Null时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中镇喊空该外键值为null(不过这就要求该外键允许取null)。
当某表被外键约束关联时,InnoDB不允许你删除该表,除非你执行了SET foreign_key_checks = 0命令。当LOAD DATA和ALTER TABLE *** 滑做作时设置foreign_key_checks为0是很有用的,可以避免外键检查提高效仔让森率。foreign_key_checks从MySQL 3.23.52 and 4.0.3开始时可用的。
查看念亩当前FOREIGN_KEY_CHECKS的值可用如下命令
SELECT @@FOREIGN_KEY_CHECKS
禁用外键约束:SET FOREIGN_KEY_CHECKS=0
启动外键约束:SET FOREIGN_KEY_CHECKS=1
其他参考:
http://dev.mysql.com/doc/refman/4.1/en/innodb-foreign-key-constraints.html
MySQL之外键约束:
http://blog.csdn.net/cnjsnt_s/article/details/5548280
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)