首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将主键更改为复合主键

将主键更改为复合主键
EN

Stack Overflow用户
提问于 2015-01-08 02:47:08
回答 2查看 2.1K关注 0票数 1

我一直在为我的一个表使用“正常”(非复合)主键。现在,我想将它更改为一个复合主键。我的桌子看起来像这样:

代码语言:javascript
复制
-- 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不想删除旧的主键,因为其他表引用它。

有没有办法在不删除整个数据库的情况下解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-08 02:52:43

在删除约束约束之前,可以在id上添加一个冗余的PRIMARY KEY。满足FK约束的要求。每份文件:

外键必须引用作为主键或形成唯一约束的列。

大胆强调我的。

显然,FK约束绑定到在pg_depend中显式创建的PK约束。因此,您需要删除并在稍后重新创建所有引用FK约束或处理系统表的混乱(这是不可取的!)最好在一笔交易中保持参照完整性:

代码语言:javascript
复制
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 (通过查询来显示目录条目,提供名称等)。

ALTER TABLE中的详细信息。

作为中间状态,这才有意义。如果id保持UNIQUE NOT NULL,那么它也可能是PK。

票数 1
EN

Stack Overflow用户

发布于 2015-01-08 15:19:24

我假设您希望更改所有引用外键以使用新的主键,对吗?因此,您必须删除所有这些外键,然后删除主键,然后创建新的主键,然后创建引用新主键的新外键。因此,如果有10个引用此表的FKs,则必须执行10滴FKs、1滴旧PK、1 alter以添加新PK,然后进行10次更改以添加新FKs。

我手边没有Postgres的例子,但我不认为有任何捷径可以做到。我认为你必须做所有22步。但是你不需要删除数据库,只需要所有的FKs。

如果您希望旧的FKs继续指向旧的PK,当您完成时它将不再是PK,那么正如Erwin所说,您应该能够对它添加一个唯一的约束。虽然我认为他的例子是落后的,因为您必须在删除PK之前添加唯一的约束,否则您将得到相同的消息。就像我说的,手边没有一份Postgres的副本来检查这个。在Server中,可以添加一个唯一的索引,然后删除pk,然后创建新的pk。我想最坏的情况是,你必须放弃10 FKs,然后重新创建它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27832154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档