[英]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
值在表dealer
和affiliate
之間是唯一的?
在SQL中可以使用不同的設置來進行繼承,為此,您可以在表user
中使用整數列type
來標記user
的類型,並引用表user_type (id,name)
,其值將為1,dealer
和2,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)
);
這本身不會在表之間強制唯一性,因此在實現此功能后,您將具有以下選擇:
dealer
和affiliate
-如果您依靠類型字段來查看用戶是哪一位,則不需要它們。 如果必須保留那些繼承的表,則可以:
INSERT
或UPDATE
上激活 另一個(有點笨拙)的解決方案: 將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.