我在 Oracle 数据库中有一对具有一对一父子关系的表。不幸的是,外键是在父级中定义的,而不是在子级中:
----------------- -----------------
| messages | | payloads |
----------------- -----------------
| id | | id |
| payload_id |------->| content |
| creation_date | -----------------
-----------------
messages.payload_id
from to的关系payloads.id
由不可延迟的外键强制执行。
我们有一个查询,它删除了消息创建日期在特定时间之后的所有消息和有效负载。不幸的是,由于反向外键,当前查询如下所示:
DELETE FROM messages WHERE creation_date < deletion_date;
DELETE FROM payloads WHERE id NOT IN (SELECT payload_id FROM messages);
第二个讨厌的删除语句是问题所在,因为当我们在每个表中有大约 5000 万条记录时,它需要一个多小时。
有没有更好的方法来删除所有消息和有效负载?
请注意,不幸的是,架构超出了我们的控制范围......