首页 > 解决方案 > PostgreSQL 约束和主键同名

问题描述

从 Oracle 迁移我想重用一些定义,例如:

ALTER TABLE CLIENTUSERS
ADD CONSTRAINT UK_CLIENTUSERS_CLIENTUS UNIQUE (CLIENTID, USERID)
USING INDEX TABLESPACE IDX

但是,这失败了,因为子句using index缺少索引名称。问题是当我指定UK_CLIENTUSERS_CLIENTUS它失败时[42P07] ERROR: relation "uk_clientusers_clientus" already exists

我是否需要为约束生成另一个名称,或者是否可以像 oracle 一样重用索引的名称?

标签: postgresql

解决方案


如果要使用USING INDEX语法,则应在ALTER TABLE语句中省略列列表:

CREATE TABLE CLIENTUSERS(CLIENTID INT, USERID INT);

CREATE UNIQUE INDEX UK_CLIENTUSERS_CLIENTUS ON CLIENTUSERS(CLIENTID, USERID);

ALTER TABLE CLIENTUSERS
ADD CONSTRAINT UK_CLIENTUSERS_CLIENTUS UNIQUE -- here columns were removed
USING INDEX UK_CLIENTUSERS_CLIENTUS;

db<>小提琴演示


推荐阅读