首页 > 解决方案 > 像这样从复合 PK 迁移到单个 PK 是否安全

问题描述

我有一个带有复合 PK (code_id, user_id)的表,它已经有 10 万条记录。从复合 PK 转移到单个 PK 是否安全,如下例所示?

ALTER TABLE orders
  DROP CONSTRAINT pk_code_id_user_id,
  ADD COLUMN order_id SERIAL,
  ADD CONSTRAINT pk_order_id PRIMARY KEY (order_id);

标签: postgresql

解决方案


是的,这是安全的,并且会起作用。

唯一的问题是这个语句可能需要一段时间才能完成:

  • 所有行都必须使用DEFAULT序列值进行更新

  • 建立了一个新的唯一索引

  • PostgreSQL 检查order_id IS NOT NULL所有行

在此期间,表处于锁定ACCESS EXCLUSIVE模式,因此即使并发读取也无法使用。

但是像这样的小桌子应该不是什么大问题。

如果存在引用旧主键约束的外键约束,事情会变得更加复杂。您也必须放弃这些并考虑一个好的替代品。


推荐阅读