我在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
之间保持唯一?
答案 0 :(得分:0)
在SQL中有不同的设置用于继承,为此你可以在表type
中使用一个标记用户类型的整数列user
并引用表{{ 1}}具有值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
。