【问题标题】:there is no unique constraint matching given keys for referenced table引用表的给定键没有唯一约束匹配
【发布时间】:2017-08-11 00:51:25
【问题描述】:

我在创建包含来自另一个具有两个主键的表的外键的表时遇到问题。

下表是:

create table names_types(
id_name serial,name varchar(70),type varchar(70),primary key(id_name,name)
);

create table risk_final(
id_risk serial,id_date varchar(70)references date_final(vdate_id)
,name varchar(70)references names_types(name)
,var_mc_risk varchar(70)
,mvar_mc_risk varchar(70)
,incvar_mc_risk varchar(70)
,cvar_mc_risk varchar(70)
,delta varchar(70)
,present_value varchar(70)
,net_exposure varchar(70)
,amount varchar(70)
,primary key(id_risk,id_date,name)
);

无法创建表 risk_final 并给我错误:

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

我该如何解决?

【问题讨论】:

标签: postgresql


【解决方案1】:

我认为信息非常明确:您不能引用键的 部分,无论是主键还是候选键(因此是“唯一约束”)。如果您需要引用 names_types 表,您可以在后一个表上创建一个代理键并引用此键(例如整数 id),但如果您实际上只想引用 name 列,您应该有第三个表,例如names,以name为主键:

create table names (name varchar(70), primary key (name));
create table types (id_name serial, primary key (id_name));
create table names_types (id_name serial references types(id_name), 
                          name varchar(70) references names(name), 
                          primary key(id_name, name));

【讨论】:

  • 我不明白你,我只需要引用名称列,但是名称列本身不能作为主键,我需要一个id。我该怎么办?
  • CREATE TABLE names (name varchar(70), primary key (name) 然后引用此表:CREATE TABLE risk_final (..., name varchar(70) references names(name), ...
  • 我明白了你的意思,名称(名称 varchar(70) 主键,类型 varchar(70)),但在这种情况下,名称对于一个类型来说是唯一的,在某些情况下我需要拥有多个公司具有相同的名称,这就是为什么我需要一个 id 作为名称为“主键(id,name)”的主键。请帮忙
  • 创建表名(name varchar(70),主键(name));创建表类型(id_name 序列号,主键(id_name)); create table names_types (id_name serial references types(id_name), name varchar(70) references names(name), primary key(id_name, name));
  • 只要它对你的模型是正确的......我更新了答案的完整性。
猜你喜欢
  • 1970-01-01
  • 2016-04-13
  • 2022-09-27
  • 2012-01-09
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
相关资源
最近更新 更多