Postgresql 外键——没有唯一约束

use*_*303 6 sql postgresql foreign-keys

我有以下情况:

我有一个表格,其中包含各种语言的文本条目。它的定义如下:

    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
    );
Run Code Online (Sandbox Code Playgroud)

语言表只是一个语言代码列表,并没有那么重要。

现在,在另一个表上,我需要引用一段文本,但我不需要,而且我不知道检索文本的语言。我只知道要检索的文本的 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
    );
Run Code Online (Sandbox Code Playgroud)

失败了

错误:没有唯一约束匹配给定键的引用表“文本”

我知道为了避免这个错误,我必须创建一个只包含 textid 的中间表,它将被内容和文本引用,但我真的觉得这是一个矫枉过正的......我的想法是虽然 textid 不是唯一的,但被拒绝是没有意义的......

有没有更优雅的方法来解决这个问题?

Den*_*rdy 5

我知道为了避免这个错误,我必须创建一个只包含 textid 的中间表,它将被内容和文本引用,但我真的觉得这是一种矫枉过正……有没有更优雅的方法来解决这个问题问题 ?

不,没有。

据我所知,它也是 SQL 规范的一部分:外键必须引用唯一的列。

另外,您绝对确定这个中间表在某些时候不会有用吗?比如说,要包含诸如 parent_text_id 之类的元数据,以防您引入一些层次结构?或者更重要的是:在不知道或不需要“检索文本的语言”的情况下“引用一段文本”。