Die folgende Beispieltabellenstruktur gibt einen FEHLER an: Es gibt keine eindeutige Einschränkung, die den angegebenen Schlüsseln für die referenzierte Tabelle entspricht, und nachdem ich sie eine Weile angestarrt habe, kann ich nicht herausfinden, warum dieser Fehler in dieser Situation auftritt.
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;
Das Ausführen des obigen Codes führt zu dem folgenden Fehler, der für mich keinen Sinn ergibt. Kann jemand erklären, warum dieser Fehler auftritt? Ich benutze 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
quelle
In postgresql müssen alle Fremdschlüssel auf einen eindeutigen Schlüssel in der übergeordneten Tabelle verweisen. In Ihrer
bar
Tabelle müssen Sie also einenunique (name)
Index haben.Siehe auch http://www.postgresql.org/docs/9.1/static/ddl-constraints.html#DDL-CONSTRAINTS-FK und speziell:
Hervorhebung von mir.
quelle
Wenn Sie
UNIQUE
eine Einschränkung auf Tabellenebene ausführen, wie Sie es getan haben, ist Ihre Definition ein bisschen wie ein zusammengesetzter Primärschlüssel. Siehe ddl-Einschränkungen . Hier ist ein AuszugDies bedeutet, dass jedes Feld möglicherweise einen nicht eindeutigen Wert haben kann, vorausgesetzt, die Kombination ist eindeutig und entspricht nicht Ihrer Fremdschlüsseleinschränkung.
Höchstwahrscheinlich möchten Sie, dass sich die Einschränkung auf Spaltenebene befindet. Definieren Sie sie also lieber als Einschränkungen auf Tabellenebene, hängen Sie sie
UNIQUE
an das Ende dername VARCHAR(60) NOT NULL UNIQUE
Spaltendefinition an oder geben Sie für jedes Feld einzelne Einschränkungen auf Tabellenebene an.quelle
Sie sollten eine Namensspalte als eindeutige Einschränkung haben. Hier sind 3 Codezeilen, um Ihre Probleme zu ändern
Ermitteln Sie zunächst die Einschränkungen des Primärschlüssels, indem Sie diesen Code eingeben
Sie werden unten so angezeigt
"some_constraint" PRIMARY KEY, btree (column)
Löschen Sie die Einschränkung:
Fügen Sie eine neue Primärschlüsselspalte mit der vorhandenen hinzu:
Das ist alles.
quelle