GBase8s如何在有外键关系的表中删除数据?

GBase8s如何在有外键关系的表中删除数据?,第1张

有两种方式:

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选项的效果是一样的。]


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9960527.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存