Postgresql 像这样从复合PK迁移到单个PK安全吗

Postgresql 像这样从复合PK迁移到单个PK安全吗,postgresql,Postgresql,我有一个具有复合PK(code\u id,user\u id)的表,该表已经有100k条记录。像下面的例子一样,从复合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); 是的,这是安全的,而且会起作用 唯一的问题是,这句话可能需要一段时间才能

我有一个具有复合PK(code\u id,user\u id)的表,该表已经有100k条记录。像下面的例子一样,从复合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检查所有行的
    order\u id是否不为NULL

在此期间,表被锁定在
ACCESS EXCLUSIVE
模式,因此即使在并发读取时也不可用

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


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

谢谢,pg是否也会删除复合索引(代码id、用户id)或在pk更改后保留?是的。如果删除约束,将自动删除实现约束的索引。