簡體   English   中英

Postgresql具有相同外鍵唯一約束的多個表

[英]Postgresql multiple tables with same foreign key unique constraint

我在PostgreSQL 9.4上有以下表格

CREATE TABLE "user" (
    id SERIAL PRIMARY KEY,
    email CHARACTER VARYING NOT NULL,
    password CHARACTER VARYING NOT NULL
);

CREATE TABLE "dealer" (
    id SERIAL PRIMARY KEY,
    user_id INTEGER NOT NULL REFERENCES "user" (id) ON DELETE RESTRICT
);

CREATE TABLE "affiliate" (
    id SERIAL PRIMARY KEY,
    user_id INTEGER NOT NULL REFERENCES "user" (id) ON DELETE RESTRICT
);

是否可以迫使user_id值在表dealeraffiliate之間是唯一的?

在SQL中可以使用不同的設置來進行繼承,為此,您可以在表user中使用整數列type來標記user的類型,並引用表user_type (id,name) ,其值將為1,dealer2,affiliate

CREATE TABLE user_type (
  id INTEGER PRIMARY KEY, --could be SERIAL
  name text
);
INSERT INTO user_type VALUES (1,'dealer'), (2, 'affiliate');

CREATE TABLE "user" (
    id SERIAL PRIMARY KEY,
    email CHARACTER VARYING NOT NULL,
    password CHARACTER VARYING NOT NULL,
    user_type INTEGER REFERENCES user_type NOT NULL,
    UNIQUE(id,user_type)
);

這本身不會在表之間強制唯一性,因此在實現此功能后,您將具有以下選擇:

  • 刪除表dealeraffiliate -如果您依靠類型字段來查看用戶是哪一位,則不需要它們。

如果必須保留那些繼承的表,則可以:

  • 使用觸發器 -這些觸發器檢查唯一性,並且將在INSERTUPDATE上激活
  • 另一個(有點笨拙)的解決方案: user_type字段添加到兩個子表中,如下所示:

     CREATE TABLE "dealer" ( id SERIAL PRIMARY KEY, user_id INTEGER NOT NULL, user_type INTEGER NOT NULL DEFAULT 1 check (user_type = 1), FOREIGN KEY (user_id,user_type) REFERENCES "user"(id,user_type) ON DELETE RESTRICT ); CREATE TABLE "affiliate" ( id SERIAL PRIMARY KEY, user_id INTEGER NOT NULL, user_type INTEGER NOT NULL DEFAULT 2 check (user_type = 2), FOREIGN KEY (user_id,user_type) REFERENCES "user"(id,user_type) ON DELETE RESTRICT ); 

    支票和外鍵共同確保您在主表中不能同時擁有兩種類型的用戶。 注意, user_id也可以用作子表中的PRIMARY KEY 當前, user的一行可能已鏈接了多個dealer行,因此至少您可能希望將子表中的user_id外鍵設置為UNIQUE

暫無
暫無

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

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