SQL 中的继承有不同的设置,为此您可以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
.