什么是导致错误:没有唯一的约束匹配给定的键为参考表?

下面的示例表结构给出了一个错误:没有唯一的约束匹配给定的键的引用表,并盯着它,现在我不明白为什么这个错误出现在这种情况下。

BEGIN; CREATE TABLE foo ( name VARCHAR(256) PRIMARY KEY ); CREATE TABLE bar( pkey SERIAL PRIMARY KEY, foo_fk VARCHAR(256) NOT NULL REFERENCES foo(name), name VARCHAR(256) NOT NULL, UNIQUE (foo_fk,name) ); CREATE TABLE baz( pkey SERIAL PRIMARY KEY, bar_fk VARCHAR(256) NOT NULL REFERENCES bar(name), name VARCHAR(256) ); COMMIT; 

运行上面的代码给出了下面的错误,这对我来说是没有意义的,任何人都可以解释为什么会出现这个错误。 我正在使用postgres 9.1

 NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "foo_pkey" for table "foo" NOTICE: CREATE TABLE will create implicit sequence "bar_pkey_seq" for serial column "bar.pkey" NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "bar_pkey" for table "bar" NOTICE: CREATE TABLE / UNIQUE will create implicit index "bar_foo_fk_name_key" for table "bar" NOTICE: CREATE TABLE will create implicit sequence "baz_pkey_seq" for serial column "baz.pkey" NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "baz_pkey" for table "baz" ERROR: there is no unique constraint matching given keys for referenced table "bar" ********** Error ********** ERROR: there is no unique constraint matching given keys for referenced table "bar" SQL state: 42830 

这是因为bar表上的name列没有UNIQUE约束。

所以想象你在bar桌上有2行包含名称'ams'并且你在bar_fk上用'ams'bazbar_fk一行,那么它会引用哪一行,因为有两行匹配?

在postgresql中,所有外键都必须引用父表中的唯一键 ,因此在bar表中必须具有unique (name)索引。

另见http://www.postgresql.org/docs/9.1/static/ddl-constraints.html#DDL-CONSTRAINTS-FK ,特别是:

最后,我们应该提到一个外键必须引用既是主键又是唯一约束的列。

强调我的。

当你做UNIQUE作为表级约束,你已经做了什么,那么你的定义有点像一个复合主键看ddl约束 ,这里是一个摘录

 "This specifies that the *combination* of values in the indicated columns is unique across the whole table, though any one of the columns need not be (and ordinarily isn't) unique." 

这意味着任何一个字段都可能有一个非唯一的值,只要这个组合是唯一的,并且不符合你的外键约束。

最有可能的是你想约束在列级别。 而是将它们定义为表级约束,将' UNIQUE '追加到列定义的末尾,如name VARCHAR(60) NOT NULL UNIQUE或为每个字段指定单独的表级约束。