Postgresql,引用唯一约束

时间:2018-04-23 07:16:29

标签: sql postgresql foreign-keys

我正在运行PostgreSQL 9.4并拥有下表:

CREATE TABLE user_cars (
    user_id SERIAL REFERENCES users (id) ON DELETE CASCADE,
    car CHARACTER VARYING(255) NOT NULL,
    CONSTRAINT test UNIQUE (user_id, car)
);

该表允许用户拥有多辆汽车,但仅使用汽车名称一次。但其他用户可能拥有相同的汽车名称。

我想要另一个表格,其中包含对唯一约束test的引用,并尝试了类似的内容:

CREATE TABLE mappings (
    other_id CHARACTER(9) REFERENCES other (id) ON DELETE CASCADE,
    user_cars  REFERENCES user_cards (test) ON DELETE CASCADE
);

但是这显然失败了#34;显然"。我想确保other_id只有一个user_car条目的引用。

因此,要解释一下,我在表mappings中如何从表test中引用user_cars。 这是目前失败的事情:

    user_cars  REFERENCES user_cards (test) ON DELETE CASCADE

2 个答案:

答案 0 :(得分:0)

如果car应该是唯一的,请仅在UNIQUE列添加car约束。 如果user应该是唯一的,请仅在UNIQUE列添加user约束。

如果您在组合上添加UNIQUE约束,则表格中会有重复值。

更新: 您可以在单列上添加多个约束。在Foreign key表的UNIQUE列上添加user_cars约束{/ 1}}。

答案 1 :(得分:0)

如果可以避免,请不要使用复合外键引用。只需在表格中添加唯一ID:

CREATE TABLE user_cars (
    user_car_id serial primary key,
    user_id int REFERENCES users (id) ON DELETE CASCADE,
    car CHARACTER VARYING(255) NOT NULL,
    CONSTRAINT test UNIQUE (user_id, car)
);

然后映射就是:

CREATE TABLE mappings (
    mapping_id serial primary key,
    user_car_id int references user_cars(user_car_id) on delete cascade,
    other_id CHARACTER(9) REFERENCES other (id) ON DELETE CASCADE,
);