Что вызывает ошибку: нет уникального ограничения, соответствующего заданным ключам для ссылочной таблицы?


ниже примера структура таблицы дает ошибку: нет уникального ограничения, соответствующего заданным ключам для ссылочной таблицы, и, глядя на нее, пока я не могу понять, почему эта ошибка возникает в этой ситуации.

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
4 74

4 ответа:

потому что на bar таблица не имеет уникальный ограничения.

Итак, представьте, что у вас есть 2 строки на bar таблица, содержащая имя 'ams' и вы вставляете строку на baz С 'ams' on bar_fk, что строки на bar это касается, так как есть две строки, соответствующие?

в PostgreSQL все внешние ключи должны ссылаться на уникальный ключ в родительской таблице, так что в ваших bar таблица у вас должна быть .

Смотрите также 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 или указать индивидуальные ограничения уровня таблицы для каждого поля.

вы должны иметь столбец name в качестве уникального ограничения. вот 3 строки кода, чтобы изменить ваши проблемы

1.Сначала узнайте ограничения первичного ключа, введя этот код

\d table_name

вы показали, как это на дно "some_constraint" первичный ключ, btree (столбец)

2.отбросьте ограничение:

ALTER TABLE table_name Drop CONSTRAINT some_constraint

3.Добавление нового столбца первичного ключа с существующим один:

ALTER TABLE имя_таблицы добавить ограничение some_constraint первичный ключ (COLUMN_NAME1, COLUMN_NAME2);

вот и все.