Что вызывает ошибку: нет уникального ограничения, соответствующего заданным ключам для ссылочной таблицы?
ниже примера структура таблицы дает ошибку: нет уникального ограничения, соответствующего заданным ключам для ссылочной таблицы, и, глядя на нее, пока я не могу понять, почему эта ошибка возникает в этой ситуации.
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 ответа:
потому что на
bar
таблица не имеет уникальный ограничения.Итак, представьте, что у вас есть 2 строки на
bar
таблица, содержащая имя'ams'
и вы вставляете строку наbaz
С'ams'
onbar_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);
вот и все.