我有两张桌子
TableOne (TABLE_ONE_ID (pk), TABLE_TWO_ID (fk), ...(something else) )
TableTwo (TABLE_TWO_ID (pk), TABLE_ONE_ID (fk), ...(something else) )
如何从这些表中删除记录?
P.S。我认为这是糟糕的设计,但这不是我的错,我没有权限更改数据库结构。我只需要知道如何从这些表中删除记录。
答案 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;