移除外键
删除一个外键 (FK) 非常简单:
alter table messages
drop constraint fk_messages_users;
然而,在高负载下,这并不是一个安全的操作,原因参照 zero-downtime Postgres schema migrations need this: lock_timeout and retries 文中所述:
- 此操作在两个表上均需要获取短暂的
AccessExclusiveLock。 - 如果至少有一个锁无法快速获取,此操作便需要等待,可能会阻塞其他会话 (包括
SELECT) 对这两个表的访问。
为了解决这个问题,我们需要使用较低的 lock_timeout 并进行重试:
set lock_timeout to '100ms';
alter ... -- be ready to fail and try again.
同样的技巧也需要用于创建一个新外键操作的第一步,当我们使用 NOT VALID 选项定义一个新外键时,正如我们在第 70 天的 How to add a foreign key 中讨论的那样。
另外请参考:day 71, How to understand what's blocking DDL