Maison >base de données >tutoriel mysql >Pourquoi ma référence de clé étrangère Postgres 9.1 échoue-t-elle avec une erreur « Contrainte unique » ?
Résolution de l'erreur « Contrainte unique non résolue » dans les références de clés étrangères PostgreSQL 9.1
Lors de la création d'une structure de table contenant des références de clés étrangères dans PostgreSQL 9.1, vous pouvez rencontrer des erreurs inattendues. Cette erreur résulte d'une configuration de contrainte incohérente.
Le code SQL en question implique la création de trois tables : foo, bar et baz. La table foo a une clé primaire sur la colonne name, tandis que la table bar définit la colonne foo_fk comme une clé étrangère faisant référence à foo(name). Cependant, le message d'erreur se plaint du fait que la colonne de nom référencée dans la table bar ne dispose pas d'une contrainte d'unicité.
Pour comprendre ce problème, considérons le scénario dans lequel plusieurs lignes de la table à barres partagent la même valeur de nom, comme indiqué dans l'exemple suivant :
<code class="language-sql">INSERT INTO bar (foo_fk, name) VALUES ('alice', 'ams'); INSERT INTO bar (foo_fk, name) VALUES ('bob', 'ams');</code>
Maintenant, si nous essayons d'insérer une ligne dans la table baz et de référencer la valeur ams ambiguë dans la table bar, PostgreSQL ne pourra pas identifier de manière unique la ligne cible. Cette ambiguïté survient car PostgreSQL ne peut pas déterminer quelle ligne de la table bar doit être référencée par la clé étrangère.
La solution consiste à renforcer le caractère unique de la colonne de nom dans la table des barres. En ajoutant une contrainte unique à la colonne name, nous garantissons que chaque ligne de la table bar a une valeur de nom différente, supprimant ainsi toute ambiguïté et permettant à PostgreSQL d'identifier de manière unique la ligne référencée.
Le code SQL corrigé incluant les contraintes nécessaires est le suivant :
<code class="language-sql">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 (name) -- 添加唯一约束 ); CREATE TABLE baz( pkey SERIAL PRIMARY KEY, bar_fk VARCHAR(256) NOT NULL REFERENCES bar(name), name VARCHAR(256) );</code>
Avec cette contrainte unique, PostgreSQL peut désormais créer avec succès la structure de la table et éviter l'erreur « Aucune contrainte unique correspondant à la clé donnée ».
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!