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

标签 sql postgresql database-design foreign-keys unique-constraint

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

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

相关文章:

mongodb - 在 MongoDB 中建模用户到项目的数据库

mysql - 交易目的地外键的在线信用系统表布局

sql - 从单列中选择多行到单行

c# - 从 C# 将数据库名称作为变量传递给 SQL。是否可以?

mysql - 数据库表中的多级用户

linux - PostgreSQL 12 - "base"目录中的大型缓存文件

postgresql - Unique Constraint 错误在 PostgreSQL 中创建表(从 MySQL 迁移)

database - 多个一对多关系设计

php - 如何检测用户是否接受条款?

sql - 物化 View 未更新