1、先删除外键表中的数据,再删除当前数据
举例:
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.
先删外键,再删主键,要不然你会遇到错误。按照你的例子,你需要先删掉B中的关于A的信息,然后你才恩那个删除A汇总的ID。
你想想这样,如果你先删除了A中的东西,那么B中的一部分AID的外键就暂时变的毫无意义。如果你是sql的设计者,你觉得这样准确严谨么。你可以自己先建个简单的试试。
他所说的没关系,是你在建立表格关联的时候在属性里面选择了cascading deleting.
1、自动生成所有的DROP语句,将其中的MyDatabaseName替换成你的数据库名称:
SELECT concat('DROP TABLE IF EXISTS ', table_name, '')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName'2、然后,在生成的代码前后添加下面设置FOREIGN_KEY_CHECKS变量的语句:
SET FOREIGN_KEY_CHECKS = 0
-- DROP语句
SET FOREIGN_KEY_CHECKS = 1
扩展资料:外键约束可双击关系线添加外键约束,外键约束有四种不同的选项:CASCADE, SET NULL, NO ACTION, RESTRICT。
1、CASCADE : 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。[ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。]
2、SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。[注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。]
3、NO ACTION: InnoDB拒绝删除或者更新父表。
4、RESTRICT: 拒绝删除或者更新父表。[指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)