PostgreSQL,在不停机/锁定的情况下向现有表添加唯一约束

我正在尝试找出将新的 varchar 列添加到 PostgreSQL 数据库中不获取表锁或不需要停机的现有表的最佳方法。

我知道我可以同时添加一个索引来防止锁定。

CREATE     UNIQUE INDEX CONCURRENTLY IF     NOT     EXISTS "my_unique_index"     ON "my_table"     USING

我不确定,也无法从文档中推断出,如果唯一索引已经存在,约束操作是否会获取表上的锁。

ALTER     TABLE "my_table"     ADD     CONSTRAINT "my_unique_constraint"     UNIQUE     USING

我在文档中看到

NOT VALID

选项对唯一约束没有用。

任何建议都会很棒。

PostgreSQL
数据库
2023-05-12 13:17:01
浏览
收藏 0
回答 2
待解决
回答 2
按赞同
/
按时间
那年风夏

你首先创建唯一索引

CONCURRENTLY

然后添加基于该索引的约束的方法很好。

ALTER     TABLE

需要一个

ACCESS EXCLUSIVE

锁,但这只会保持很短的时间。这不会成为问题,除非你的数据库中总是有长时间运行的事务——但在那种情况下你已经有问题了。

分享
微博
QQ
微信
回复
2023-05-15 12:55:38
pgdba

​显式锁定​


​SHARE UPDATE EXCLUSIVE​

与​​SHARE UPDATE EXCLUSIVE​​、​​SHARE​​、​​SHARE ROW EXCLUSIVE​​、​​EXCLUSIVE​​和​​ACCESS EXCLUSIVE​​锁模式冲突。这种模式保护一个表不受并发模式改变和​​VACUUM​​运行的影响。

由​​VACUUM​​​(不带​​FULL​​​)、​​ANALYZE​​​、​​CREATE INDEX CONCURRENTLY​​​、​​CREATE STATISTICS​​​和​​ALTER TABLE VALIDATE​​​以及其他​​ALTER TABLE​​的变体获得。


​SHARE​

与​​ROW EXCLUSIVE​​、​​SHARE UPDATE EXCLUSIVE​​、​​SHARE ROW EXCLUSIVE​​、​​EXCLUSIVE​​和​​ACCESS EXCLUSIVE​​锁模式冲突。这种模式保护一个表不受并发数据改变的影响。

由​​CREATE INDEX​​​(不带​​CONCURRENTLY​​)取得。


​ACCESS EXCLUSIVE​

与所有模式的锁冲突(​​ACCESS SHARE​​、​​ROW SHARE​​、​​ROW EXCLUSIVE​​、​​SHARE UPDATE EXCLUSIVE​​、​​SHARE​​、​​SHARE ROW EXCLUSIVE​​、​​EXCLUSIVE​​和​​ACCESS EXCLUSIVE​​)。这种模式保证持有者是访问该表的唯一事务。

由​​ALTER TABLE​​、​​DROP TABLE​​、​​TRUNCATE​​、​​REINDEX​​、​​CLUSTER​​、​​VACUUM FULL​​和​​REFRESH MATERIALIZED VIEW​​(不带​​CONCURRENTLY​​)命令获取。​​ALTER TABLE​​的很多形式也在这个层面上获得锁(见​​ALTER TABLE​​)。这也是未显式指定模式的​​LOCK TABLE​​命令的默认锁模式。

分享
微博
QQ
微信
回复
2023-05-27 14:15:00
相关问题
PostgreSQL group by 获取唯一值并添加
1008浏览 • 2回复 待解决
什么情况下会使用多Module
520浏览 • 1回复 待解决
candidate 会在哪三种情况下退出?
2007浏览 • 1回复 待解决
如何实现个组件不停地旋转
306浏览 • 1回复 待解决