首页 > 解决方案 > PostgreSQL 复合外键“列列表不得包含重复项”

问题描述

这是我的示例架构:

CREATE TABLE users (
    userid BIGSERIAL PRIMARY KEY,
    name varchar(25) NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE follows (
    userid1 int NOT NULL,
    userid2 int NOT NULL,
    PRIMARY KEY (userid1, userid2),
    FOREIGN KEY (userid1, userid2) REFERENCES users (userid) ON DELETE CASCADE
);

如果我运行这个命令,我会得到:

ERROR: number of referencing and referenced columns for foreign key disagree

如果我添加... REFERENCES users (userid, userid) ON DELETE CASCADE

我得到:

ERROR: foreign key referenced-columns list must not contain duplicate

我知道如果我在每一行中输入它们各自的引用,它会起作用,但最好不要重复自己。

如何通过使用相同依赖项的复合外键来实现这一点?

标签: sqlpostgresql

解决方案


您需要两个单独的外键约束:

CREATE TABLE follows (
    userid1 int NOT NULL,
    userid2 int NOT NULL,
    PRIMARY KEY (userid1, userid2),
    FOREIGN KEY (userid1) REFERENCES users (userid) ON DELETE CASCADE,
    FOREIGN KEY (userid2) REFERENCES users (userid) ON DELETE CASCADE
);

推荐阅读