L'exemple de structure de table ci-dessous donne une ERREUR: il n'y a pas de contrainte unique correspondant aux clés données pour la table référencée, et après l'avoir regardée pendant un moment, je ne peux pas comprendre pourquoi cette erreur se produit dans cette situation.
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;
L'exécution du code ci-dessus donne l'erreur suivante, ce qui n'a aucun sens pour moi, quelqu'un peut-il expliquer pourquoi cette erreur se produit. J'utilise 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
la source
la source
Dans postgresql, toutes les clés étrangères doivent référencer une clé unique dans la table parent, donc dans votre
bar
table, vous devez avoir ununique (name)
index.Voir également http://www.postgresql.org/docs/9.1/static/ddl-constraints.html#DDL-CONSTRAINTS-FK et plus précisément:
Soulignez le mien.
la source
quand vous faites
UNIQUE
comme une contrainte au niveau de la table comme vous l'avez fait alors ce que votre définition est un peu comme une clé primaire composite voir les contraintes ddl , voici un extraitcela signifie que l'un ou l'autre des champs peut avoir une valeur non unique à condition que la combinaison soit unique et que cela ne corresponde pas à votre contrainte de clé étrangère.
il est fort probable que vous souhaitiez que la contrainte soit au niveau de la colonne. Ainsi plutôt que de les définir comme des contraintes au niveau de la table, «ajoutez»
UNIQUE
à la fin de la définition de colonne commename VARCHAR(60) NOT NULL UNIQUE
ou spécifiez des contraintes de niveau de table individuelles pour chaque champ.la source
Vous devez avoir la colonne de nom comme contrainte unique. voici 3 lignes de code pour changer vos problèmes
Découvrez d'abord les contraintes de clé primaire en tapant ce code
vous êtes montré comme ça en bas
"some_constraint" PRIMARY KEY, btree (column)
Supprimez la contrainte:
Ajoutez une nouvelle colonne de clé primaire avec une colonne existante:
C'est tout.
la source