【问题标题】:No unique constraint matching given keys for referenced table没有与引用表的给定键匹配的唯一约束
【发布时间】:2012-01-09 03:52:18
【问题描述】:

我有一个date_dimension 表定义:

CREATE TABLE date_dimension
(
  id integer primary key,
  date text,
  year double precision,
  year_for_week double precision,
  quarter double precision
);

我正在尝试创建一个失败的fact

create table fact ( 
  id serial primary key,
  contract integer,
  component integer,
  evaluation_date integer,
  effective_date integer,
  foreign key (evaluation_date, effective_date) references date_dimension(id, id)
);

错误是:

ERROR:  there is no unique constraint matching given keys for referenced 
table "date_dimension"

SQL state: 42830 

我不知道如何解决这个问题。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    错误告诉您问题所在:date_dimension 上没有与您的外键约束匹配的唯一约束。

    但是,这会导致更大的设计问题:您的外键关系没有任何意义。

    您可以通过以下方式解决您的“问题”:

    CREATE UNIQUE INDEX date_dimension(id,id);
    

    但这很愚蠢,因为id 总是一样的。也可以表示为:

    FOREIGN KEY (evaluation_date) REFERENCES date_dimension(id);
    

    然后删除 effective_date 列,在您的示例中,该列始终与 evaluation_date 相同。

    或者...您可能真的想要两个 FK 关系:

    FOREIGN KEY (evaluation_date) REFERENCES date_dimension(id);
    FOREIGN KEY (effective_date) REFERENCES date_dimension(id);
    

    【讨论】:

    • 我有这个错误,我不能做一个约束,因为我们在那个表中有重复的行。显然外键不是我想要的,但我想要一个约束:“存在于这个表中”,有可能吗?
    • @isaaclw:有一些方法可以做到这一点,但它们通常不是很漂亮。你应该问另一个问题(或搜索——我敢肯定有人已经在这里问过了)。
    【解决方案2】:

    我认为您正在寻找两个单独的外键:

    foreign key (evaluation_date) references date_dimension(id),
    foreign key (effective_date) references date_dimension(id)
    

    【讨论】:

      【解决方案3】:

      您是否只想为日期维度创建两个单独的外键引用,如下所示:

      create table fact ( 
          id serial primary key,
          contract integer,
          component integer,
          evaluation_date integer,
          effective_date integer,
          foreign key (evaluation_date) references date_dimension(id),
          foreign key (effective_date) references date_dimension(id)
      );
      

      【讨论】:

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