我一直在我的一个表中使用“正常”(非复合)主键。现在我想将其更改为复合主键。 我的表格看起来像这样:
-- Table 1
CREATE TABLE foo (
id SERIAL PRIMARY KEY,
id2 INT,
...
)
-- Table 2
CREATE TABLE bar (
id SERIAL PRIMARY KEY,
id_foo INT REFERENCES foo (id)
)
这里的问题是 psql 不想删除旧的主键,因为其他表引用了它。
有没有办法在不删除整个数据库的情况下解决这个问题?
最佳答案
您可以添加多余的 UNIQUE
constraint在删除 PRIMARY KEY
约束之前先对 id
进行操作。满足FK约束的要求。 Per documentation:
A foreign key must reference columns that either are a primary key or form a unique constraint.
我的粗体强调。
显然,FK 约束绑定(bind)到它在 pg_depend
中显式创建的 PK 约束。 。因此,您需要删除并稍后重新创建所有引用 FK 约束或弄乱系统表(这是不可取的!)。最好在一个事务中保持引用完整性完整:
BEGIN;
ALTER TABLE bar DROP CONSTRAINT bar_id_foo_fkey;
ALTER TABLE foo
DROP CONSTRAINT foo_pkey
, ADD CONSTRAINT foo_uni_id UNIQUE (id)
, ADD PRIMARY KEY (id, id2);
ALTER TABLE bar ADD CONSTRAINT bar_id_foo_fkey
FOREIGN KEY (id) REFERENCES foo (id);
COMMIT;
SQL Fiddle. (通过查询显示提供名称等内容的目录条目。)
详情请参阅manual on ALTER TABLE
.
这仅在中间状态下才有意义。如果id
保持UNIQUE NOT NULL
,它也可能是PK。
关于sql - 将主键更改为复合主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27832154/