我试图找出最好的方法来向PostgreSQL数据库中的现有表添加新的varchar列,而不需要获取表锁或停机。
我知道我可以并发地添加一个索引,这将防止锁定。CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS "my_unique_index" ON "my_table" USING ("my_column", varchar_pattern_ops)
我不确定,也不能从文档中推断出的是,如果唯一索引已经存在,约束操作是否会获取表上的锁。ALTER TABLE "my_table" ADD CONSTRAINT "my_unique_constraint" UNIQUE USING INDEX "my_unique_index";
我在文档中看到NOT VALID
选项对于唯一约束没有用处。
任何建议将是伟大的。
1条答案
按热度按时间pkwftd7m1#
首先创建一个唯一索引
CONCURRENTLY
,然后基于该索引添加一个约束,这种方法很好。ALTER TABLE
将需要一个ACCESS EXCLUSIVE
锁,但这只会保持很短的时间。除非数据库中总是有长时间运行的事务,否则这不会是一个问题--但在这种情况下,您已经有了问题。