我在Oracle数据库中有一对表,它们具有一对一的父子关系。不幸的是,外键是在父级中定义的,而不是子级:
----------------- -----------------
| messages | | payloads |
----------------- -----------------
| id | | id |
| payload_id |------->| content |
| creation_date | -----------------
-----------------
从messages.payload_id
到payloads.id
的关系由不可延迟的外键强制执行。
我们有一个查询删除消息创建日期在特定时间之后的所有消息和有效负载。不幸的是,由于向后的外键,当前查询如下所示:
DELETE FROM messages WHERE creation_date < deletion_date;
DELETE FROM payloads WHERE id NOT IN (SELECT payload_id FROM messages);
第二个令人讨厌的删除声明是问题,因为每个表中有大约5000万条记录需要一个多小时。
有没有更好的方法来删除所有邮件和有效负载?
请注意,遗憾的是架构无法控制......
答案 0 :(得分:2)
您可以将要删除的ID记录到全局临时表中,然后发出删除,通过存储rowid来优化“消息”中的删除
insert into my_temp_table (messages_rowid, payload_id)
select rowid, payload_id
from messages
where creation_date < deletion_date;
delete from messages
where rowid in (select messages_rowid from my_temp_table);
delete from payload
where id in (select payload_id from my_temnp_table);
commit;
答案 1 :(得分:1)
怎么样
DELETE FROM payloads WHERE id IN
( SELECT payload_id FROM messages WHERE creation_date < deletion_date)
当然,这需要在从消息中删除之前运行。