PostgreSQL能否通过ALTER修改已创建的唯一索引(无需删除重建)
PostgreSQL中能否通过ALTER直接修改唯一索引为部分唯一索引?
不行,PostgreSQL不支持直接使用ALTER INDEX语句修改现有索引的定义,包括添加WHERE过滤条件来将普通唯一索引转为部分唯一索引。
ALTER INDEX的功能仅局限于重命名索引、调整存储参数、重建索引(REINDEX)这类操作,无法修改索引的列构成或添加过滤条件。
正确的操作步骤
要实现仅对account_id != 0的记录生效的唯一约束,必须删除原索引后重建为部分唯一索引。为了避免删除索引期间出现约束缺失的间隙,建议按以下顺序操作:
- 先创建临时的部分唯一索引:
CREATE UNIQUE INDEX account_id_status_temp_idx ON customer (account_id, status) WHERE account_id != 0;
- 删除旧的普通唯一索引:
DROP INDEX account_id_status_idx;
- 将临时索引重命名为原索引名称:
ALTER INDEX account_id_status_temp_idx RENAME TO account_id_status_idx;
这样操作后,新的account_id_status_idx就会仅对account_id != 0的记录强制(account_id, status)的唯一性,而account_id = 0的记录则不受该索引约束,只会受你之前创建的account_id_status_shop_id_idx索引约束(保证(account_id, status, shop_id)的组合唯一),从而解决新增行时的冲突问题。
内容的提问来源于stack exchange,提问作者KuWathsala
相关产品推荐
相关产品推荐

