我有以下案例:
我有一个表格,其中包含各种语言的文本条目。定义如下:
CREATE TABLE text
(
textid character varying(70) NOT NULL,
language character varying(10) NOT NULL,
content text NOT NULL,
CONSTRAINT text_pk PRIMARY KEY (textid , language ),
CONSTRAINT languages_text_fk FOREIGN KEY (language)
REFERENCES languages (language) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE RESTRICT
);
语言表只是语言代码的列表,并没有那么相关。
现在,在另一个表上我需要引用一段文本,但我不需要,而且我不知道检索文本时使用的语言。我只知道要检索的文本的 ID。实际语言将由阅读文本的用户在运行时决定。
起初我创建了这个:
CREATE TABLE content_text
(
contentid character varying(70) NOT NULL,
textid character varying(70) NOT NULL,
CONSTRAINT content_text_pk PRIMARY KEY (contentid , textid ),
CONSTRAINT content_text_text_fk FOREIGN KEY (textid)
REFERENCES text (textid) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE RESTRICT
);
失败了
ERROR: there is no unique constraint matching given keys for referenced table "text"
我知道,为了避免这个错误,我必须创建一个仅包含 textid 的中间表,该表将被内容和文本引用,但我真的觉得这是一个矫枉过正......一个表只是为了这个,在我看来,虽然 textid 不是唯一的,但被拒绝是没有意义的......
有没有更优雅的方法来解决这个问题?
最佳答案
I know that in order to avoid this error I have to create an intermediate table containing only textid which will be referenced both by content and by text, but I really feel that this is an overkill … Is there a more elegant way to go around this problem ?
不,没有。
据我所知,它也是 SQL 规范的一部分:外键必须引用唯一的列。
此外,您是否绝对确定这个中间表在某些时候不会有用?比如说,包含诸如 parent_text_id 之类的元数据,以防万一你引入了一些层次结构?或者更确切地说:在不知道或不需要“检索文本所使用的语言”的情况下“引用一段文本”。
关于sql - Postgresql 外键——没有唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20120239/