В приведенном ниже примере структуры таблицы выдается ОШИБКА: не существует уникального ограничения, соответствующего заданным ключам для ссылочной таблицы, и пока я не могу понять, почему эта ошибка возникает в этой ситуации, пока я на нее смотрю.
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
sql
postgresql
военно-картографическая служба
источник
источник
В postgresql все внешние ключи должны ссылаться на уникальный ключ в родительской таблице, поэтому в вашей
bar
таблице должен бытьunique (name)
индекс.Смотрите также http://www.postgresql.org/docs/9.1/static/ddl-constraints.html#DDL-CONSTRAINTS-FK и, в частности:
Акцент мой.
источник
когда вы делаете
UNIQUE
как ограничение уровня таблицы, как вы сделали, то, что вы определяете, немного похоже на составной первичный ключ, смотрите ограничения ddl , вот выдержкаэто означает, что любое поле может иметь неуникальное значение, если комбинация уникальна, и это не соответствует вашему ограничению внешнего ключа.
скорее всего, вы хотите, чтобы ограничение было на уровне столбца. поэтому вместо этого определите их как ограничения уровня таблицы, добавьте «
UNIQUE
конец» в конец определения столбца, какname VARCHAR(60) NOT NULL UNIQUE
или определите индивидуальные ограничения уровня таблицы для каждого поля.источник
Вы должны иметь имя столбца в качестве уникального ограничения. вот 3 строки кода, чтобы изменить ваши проблемы
Сначала выясните ограничения первичного ключа, набрав этот код
как показано внизу
"some_constraint" PRIMARY KEY, btree (column)
Отбросьте ограничение:
Добавьте новый столбец первичного ключа с существующим:
Вот и все.
источник