2

我在 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_idvalue 在表中是唯一dealeraffiliate

4

1 回答 1

0

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)
);

这本身不会强制跨表的唯一性,因此在实现此之后,您将拥有以下选项:

  • 删除表格- 如果您依赖类型字段来查看用户是哪一个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.

于 2015-03-19T18:06:14.837 回答