sql - Postgresql 外键——没有唯一约束

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

语言表只是语言代码的列表,并没有那么相关。

现在,在另一个表上我需要引用一段文本,但我不需要,而且我不知道检索文本时使用的语言。我只知道要检索的文本的 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/

相关文章:

mysql - 在区分大小写的列中进行不区分大小写的搜索(以及不区分大小写的排序)

sql - 如果第二个表中有匹配项或没有匹配项,如何编写 SQL 查询来获取记录?

postgresql - 查询没有结果数据错误的目的地

php - 从 PSQL 结果集递归构建 XML(使用 PHP)

MySQL 删除表

hibernate - Hibernate 应该能够处理重叠的外键吗?

sql - 我应该将此新列添加到客户表还是单独的新表?

c# - 为什么这个 `using` block 不释放数据库连接?

java - 多语言BBD方案

database - 为什么 postgreSQL 会两次检查外键约束?