Poniższa przykładowa struktura tabeli daje BŁĄD: nie ma unikalnego ograniczenia pasującego do podanych kluczy dla tabeli, do której się odwołujemy, a przyglądając się temu od jakiegoś czasu nie mogę zrozumieć, dlaczego ten błąd pojawia się w tej sytuacji.
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;
Uruchomienie powyższego kodu daje następujący błąd, który nie ma dla mnie sensu, ktoś może wyjaśnić, dlaczego ten błąd się pojawia. Używam 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
ams
źródło
źródło
W postgresql wszystkie klucze obce muszą odnosić się do unikalnego klucza w tabeli nadrzędnej, więc w
bar
tabeli musisz miećunique (name)
indeks.Zobacz także http://www.postgresql.org/docs/9.1/static/ddl-constraints.html#DDL-CONSTRAINTS-FK, a konkretnie:
Podkreśl moje.
źródło
kiedy wykonujesz
UNIQUE
ograniczenie na poziomie tabeli, tak jak to zrobiłeś, to to, co definiujesz, przypomina nieco złożony klucz podstawowy, zobacz ograniczenia ddl , tutaj jest wyciągoznacza to, że każde pole może prawdopodobnie mieć nieunikalną wartość, pod warunkiem, że kombinacja jest unikalna i nie pasuje do ograniczenia klucza obcego.
najprawdopodobniej chcesz, aby ograniczenie znajdowało się na poziomie kolumny. Zamiast tego zdefiniuj je jako ograniczenia na poziomie tabeli, „dołącz”
UNIQUE
na końcu definicji kolumny, np.name VARCHAR(60) NOT NULL UNIQUE
określ lub określ indywidualne ograniczenia na poziomie tabeli dla każdego pola.źródło
Powinieneś mieć kolumnę z nazwą jako unikalne ograniczenie. tutaj są 3 linie kodu, aby zmienić Twoje problemy
Najpierw znajdź ograniczenia klucza podstawowego, wpisując ten kod
jesteś pokazany w ten sposób na dole
"some_constraint" PRIMARY KEY, btree (column)
Porzuć ograniczenie:
Dodaj nową kolumnę klucza podstawowego z istniejącą:
To wszystko.
źródło