gpt4 book ai didi

sql - 将主键更改为复合主键

转载 作者:行者123 更新时间:2023-11-29 13:01:48 24 4
gpt4 key购买 nike

我一直在为我的一个表使用“普通”(非复合)主键。现在我想将其更改为复合主键。我的表格看起来像这样:

-- 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com