【问题标题】:There is no unique constraint matching given keys for referenced没有唯一约束匹配给定键的引用
【发布时间】:2019-07-29 11:10:45
【问题描述】:

表:A

            columns names
--------------------------
PK varchar |datasource
PK int     |programid
   int     |workspaceid

复合pk键:datasource和programid

表:B

             columns names
---------------------------------------
PK varchar | datasource
PK int     | quantitycontractid
   int     | workspaceid

复合pk key:datasource和quantitycontractid

我需要在这些表之间建立关系,但需要使用 workspaceid 和数据源。所以我照常尝试:

ALTER TABLE A
ADD CONSTRAINT fk_relation
FOREIGN KEY (workspaceid, datasource) 
REFERENCES B(workspaceid, datasource)

我收到以下错误:

引用表的给定键没有唯一约束匹配 “乙”

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    您需要将UNIQUE key 添加到B(workspaceid, datasource),然后才能将其视为表A 中的外键。这是为了确保两个表之间的一对一或一对多关系正确。

    ALTER TABLE B
    ADD CONSTRAINT unq_contraint
    UNIQUE KEY (workspaceid, datasource)
    

    【讨论】:

    • 嗯,但它不像一个 workspaceid 应该是其中一张表中复合键的一部分?
    • 大声笑,已经使用quantitycontractid 和datasource 创建了PK,那么为什么要基于两个字段创建额外的唯一性,将workspaceid 添加到现有的pk 不是更好吗?
    【解决方案2】:

    这个错误对我来说很有意义,你的表 B 没有任何唯一索引或主键链接到 workspaceid。话虽如此,你的 B 表结构对我来说有点奇怪。大多数数据库都有一个自动增量的主键和一个或多个链接到其他表的外键。您似乎已将主键设置为多个外键的组合。虽然这可行,但在查询表时,您将遇到您所描述的问题并且有复杂的连接。 Vishal R 已经回答了如何解决您的问题。

    【讨论】:

      猜你喜欢
      • 2017-08-11
      • 2016-04-13
      • 2022-09-27
      • 2012-01-09
      • 2014-02-17
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      相关资源
      最近更新 更多