我有两张桌子
TableOne (TABLE_ONE_ID (pk), TABLE_TWO_ID (fk), ...(something else) )
TableTwo (TABLE_TWO_ID (pk), TABLE_ONE_ID (fk), ...(something else) )
如何从这些表中删除记录?
PS我认为这是糟糕的设计,但这不是我的错,我没有更改数据库结构的权限。我只需要知道如何从这些表中删除记录。
我不确定解决这个问题的最佳方法,但我可能会做类似的事情:
UPDATE TableOne SET TABLE_TWO_ID = null;
DELETE FROM TableTwo;
DELETE FROM TableOne;
您可以使用以下方法禁用外键:
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;
要么推迟外键之一,要么分配 NULL(假设它可以为 NULL)以打破循环。
顺便说一句,你是如何插入数据的?你一定也做了一些事情来打破那里的循环。
注意:如果只有一个仔细控制的会话正在修改数据库,则禁用或删除 FK 可能没问题,但在其他客户端可能不知道他们期望的 FK 不再强制执行的并发环境中,您可能会因数据损坏而敞开大门.