引用非唯一外键的联接表

时间:2018-08-14 20:37:28

标签: sql database postgresql schema

我在数据库中有以下表格。 phrases允许存储重复的短语。

CREATE TABLE phrases (
    id INTEGER PRIMARY KEY,
    phrase VARCHAR(1000),
    creation_date TIMESTAMP WITH TIME ZONE NOT NULL,
);

CREATE TABLE intents (
    id INTEGER PRIMARY KEY,
    name VARCHAR(10) UNIQUE
);

我想在短语和意图之间创建一个联接表。我要强制执行:

  • 每个短语都存在于短语表中
  • 每个短语只出现一次

以下操作失败,因为phrases中的外键不是唯一的。

CREATE TABLE phrases_intents (
    phrase VARCHAR(1000) REFERENCES phrases (phrase),
    intent VARCHAR(10) REFERENCES intents (name),
    PRIMARY KEY (phrase),
);

允许此功能的最佳实践是什么?

1 个答案:

答案 0 :(得分:1)

修改短语表以具有用于外键关系的唯一键。也许:

CREATE TABLE phrases (
    id INTEGER PRIMARY KEY,
    phrase VARCHAR(1000),
    creation_date TIMESTAMP WITH TIME ZONE NOT NULL,
    unique (phrase, id)
);

然后在phrase_intents中使用此密钥:

CREATE TABLE phrase_intents (
    phrase_intents_id serial primary key,
    phrase varchar(1000) not null,
    phrase_id int not null, 
    intent_id int references intents (id),
    foreign key (phrase, phrase_id) references phrases(phrase, id),
    unique (phrase)
);

您的条件得到满足:

  1. 由于phrase和外键引用,每个phrasesnot null表中。
  2. 每个不同的短语最多在此表中出现一次。这是由于对phrase的唯一约束。

要让每个词组准确地出现 一次,都需要填充表格。然后,您将需要在表上使用触发器,以确保在创建新短语时会插入一行。

相关问题