Postgresql具有相同外键唯一约束的多个表

时间:2015-03-19 17:04:34

标签: sql postgresql postgresql-9.4

我在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之间保持唯一?

1 个答案:

答案 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 - 如果您依赖类型字段来查看用户是哪一个,则不需要它们。

如果您必须保留这些继承的表,您可以:

  • 使用触发器 - 这些触发器会检查唯一性,并会在affiliateINSERT
  • 上激活
  • 另一个(有点笨拙)解决方案: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

    < / LI>