使用圆形外键从两个表中删除

时间:2012-08-31 09:34:34

标签: sql oracle

我有两张桌子

TableOne (TABLE_ONE_ID (pk), TABLE_TWO_ID (fk), ...(something else) )
TableTwo (TABLE_TWO_ID (pk), TABLE_ONE_ID (fk), ...(something else) )

如何从这些表中删除记录?

P.S。我认为这是糟糕的设计,但这不是我的错,我没有权限更改数据库结构。我只需要知道如何从这些表中删除记录。

3 个答案:

答案 0 :(得分:16)

我不确定最好的方法,但我可能会做一些事情:

UPDATE TableOne SET TABLE_TWO_ID = null;
DELETE FROM TableTwo;
DELETE FROM TableOne;

答案 1 :(得分:6)

defer其中一个外键,或者指定NULL(假设它是可以为空的)来打破循环。

顺便说一句,您如何插入数据?你必须做些什么来打破那里的循环。

注意:如果只有一个精心控制的会话正在修改数据库,则禁用或删除FK可能没问题,但是如果其他客户端可能不知道他们期望的FK是并发环境中的数据损坏会让您大开不再强制执行。

答案 2 :(得分:4)

您可以使用以下命令禁用外键:

alter table TableOne disable constraint fk_table_two_id;

之后,您应该可以删除行。

根据DaveCosta的评论,您可以推迟约束检查。这样就可以在整个事务中检查约束,而不是每个单独的SQL语句。例如:

begin transaction;
set constraints all deferred; 
delete from TableTwo;
delete from TableOne;
commit transaction;