簡體   English   中英

PostgreSQL 復合外鍵“列列表不得包含重復項”

[英]PostgreSQL Composite Foreign Key 'columns list must not contain duplicates'

這是我的示例架構:

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

我知道如果我在每一行中輸入它們各自的引用,它會起作用,但最好不要重復自己。

如何通過使用相同依賴項的復合外鍵來實現這一點?

您需要兩個單獨的外鍵約束:

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
);

雖然我更喜歡 Gordon 顯示的語法,但如果你想要一個襯里,你可以將其壓縮為:

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

這種簡寫符號的缺點是 FK 沒有名稱。 如果您需要刪除或修改它們,將來管理它們可能會很棘手。 經驗告訴我最好給它們命名,為此你需要使用完整的語法,如下所示:

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

...只是為了獲取fk1fk2標識符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM