繁体   English   中英

Postgresql外键 - 没有唯一约束

[英]Postgresql foreign key — no unique constraint

我有以下情况:

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

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

失败了

错误:对于引用表“text”的给定键,没有唯一约束匹配

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

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

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

不,没有。

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

另外,你是否完全确定这个中间表在某些方面不会变得有用? 比如,如果你引入了一些层次结构,包含诸如parent_text_id之类的元数据? 或者更重要的是:“引用一段文字”而不知道或不需要“用于检索文本的语言”。

由于您使用主键(textid,language)创建了表TEXT ,因此CONTEXT_TEXT的外键必须引用相同的主键。 从而:

 CREATE TABLE content_text
    (
      contentid character varying(70) NOT NULL,
      language character varying(10) NOT NULL,
      textid character varying(70) NOT NULL,
      CONSTRAINT content_text_pk PRIMARY KEY (contentid , textid),
      CONSTRAINT content_text_text_fk FOREIGN KEY (textid, language)
          REFERENCES text (textid, language) MATCH SIMPLE
          ON UPDATE CASCADE ON DELETE RESTRICT
    );

或者,您可以从TEXT上的主键中删除language 相反,您可以创建第二个唯一索引:

  CREATE TABLE text2
    (
      textid character varying(70) NOT NULL,
      language character varying(10) NOT NULL,
      content text NOT NULL,
      CONSTRAINT text_pk PRIMARY KEY (textid),
      CONSTRAINT languages_text_fk FOREIGN KEY (language)
          REFERENCES languages (language) MATCH SIMPLE
          ON UPDATE CASCADE ON DELETE RESTRICT, 
      unique (textid, language)
    );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM