11

我有两张桌子

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

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

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

4

3 回答 3

17

我不确定解决这个问题的最佳方法,但我可能会做类似的事情:

UPDATE TableOne SET TABLE_TWO_ID = null;
DELETE FROM TableTwo;
DELETE FROM TableOne;
于 2012-08-31T09:39:32.807 回答
7

您可以使用以下方法禁用外键:

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;
于 2012-08-31T09:39:16.013 回答
7

要么推迟外键之一,要么分配 NULL(假设它可以为 NULL)以打破循环。

顺便说一句,你是如何插入数据的?你一定也做了一些事情来打破那里的循环。

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

于 2012-09-01T04:29:22.773 回答