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

Tar*_*viv 11 sql oracle

我有两张桌子

TableOne (TABLE_ONE_ID (pk), TABLE_TWO_ID (fk), ...(something else) )
TableTwo (TABLE_TWO_ID (pk), TABLE_ONE_ID (fk), ...(something else) )
Run Code Online (Sandbox Code Playgroud)

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

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

Jim*_*Jim 17

我不确定最好的方法,但我可能会这样做:

UPDATE TableOne SET TABLE_TWO_ID = null;
DELETE FROM TableTwo;
DELETE FROM TableOne;
Run Code Online (Sandbox Code Playgroud)

  • 那么table_two_id int**NOT**NULL? (2认同)

Bra*_*vic 6

无论是推迟了一个外键,或指定NULL(假设它是为空的),以打破这种循环.

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

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


And*_*mar 5

您可以通过以下方式禁用外键:

alter table TableOne disable constraint fk_table_two_id;
Run Code Online (Sandbox Code Playgroud)

之后,您应该能够删除行。

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

begin transaction;
set constraints all deferred; 
delete from TableTwo;
delete from TableOne;
commit transaction;
Run Code Online (Sandbox Code Playgroud)

  • 如果可能的话,我会说推迟约束而不是禁用它,这样它就会允许删除,但如果表不同步,则会阻止提交。在这样的设计中,永久推迟两个约束之一可能是明智的。 (2认同)