Maison > Article > développement back-end > [Résolu] Violation des contraintes d'intégrité – Conseils rapides
Si vous êtes confronté à l'erreur : "Violation de contrainte d'intégrité : impossible d'ajouter ou de mettre à jour une ligne enfant : une contrainte de clé étrangère échoue", vous êtes dans le bon article.
Habituellement, vous rencontrez cette erreur lorsque vous ajoutez une nouvelle colonne à une table et que vous la déclarez comme clé étrangère.
Dans une base de données SQL, une clé étrangère est un champ d'une table utilisé pour établir un lien entre les données d'une autre table. Considérez le tableau des clients ci-dessous.
CREATE TABLE customers ( id INT PRIMARY KEY, name VARCHAR(255), email VARCHAR(255) );
Vous souhaitez maintenant lier vos clients à un groupe. Vous devez d’abord ajouter la nouvelle colonne à la table clients qui contient la référence à la table des groupes :
# Create the new column "group_id" ALTER TABLE customers ADD COLUMN group_id INT NOT NULL;
Vous pouvez ensuite ajouter la contrainte de clé étrangère pour activer la relation avec la table des groupes :
# Add the FK constraints ALTER TABLE customers ADD CONSTRAINT fk_group_id FOREIGN KEY (group_id) REFERENCES customers(id);
Lorsque vous exécutez cette opération de modification sur la table clients, la base de données vérifiera que l'ID dans le champ group_id existe dans la table des groupes.
Lors de cette vérification, la base de données générera une "Erreur de violation d'intégrité" car la colonne group_id est toujours vide, elle ne contient donc aucune référence valide dans la table des groupes. Le moteur SQL ne parvient donc pas à appliquer la contrainte de clé étrangère. C'est parce qu'une valeur vide n'est pas une clé étrangère valide pour la table des groupes.
L'action la plus simple consiste à déclarer la nouvelle colonne comme nullable.
Vous pouvez supprimer l'instruction "NOT NULL" de la requête alter pour permettre à la colonne group_id de contenir des valeurs nulles.
Ce simple changement résoudra le problème en premier lieu, car désormais la clé étrangère peut également être nulle. Vous pouvez exécuter la migration des données pour éventuellement remplir la nouvelle colonne group_id dans la table clients, et planifier une nouvelle version pour réintroduire la contrainte "NOT NULL".
Si dans votre application un client ne peut pas exister sans un groupe spécifique, vous devez vous rappeler qu'ayant le group_id nullable, votre base de données n'est pas au courant de cette contrainte.
Si vous faites une erreur lors de la création d'une entité dans votre application, la base de données ne vous alertera pas.
Une autre solution consiste à ajouter un travail de migration de données entre la requête de modification pour ajouter la nouvelle colonne et celle pour ajouter la clé étrangère.
Une fois que vous avez la nouvelle colonne group_id dans la table clients, vous pouvez exécuter un script pour remplir cette colonne pour les lignes existantes avec un identifiant valide de la table des groupes.
Voici un exemple de requête pour effectuer cette tâche :
UPDATE customers, groups SET customers.group_id = groups.id Where customers.user_id = groups.user_id;
Dans les applications modernes, toutes ces tâches sont effectuées à l'aide de l'outil de migration. Il est généralement disponible dans la plupart des frameworks de développement d'applications courants.
Dans l'exemple ci-dessous, je vais vous montrer comment gérer le problème de violation des contraintes d'intégrité à l'aide des migrations Laravel.
Créer la migration :
php artisan make:migration add_goup_id_fk_to_customers –table=customers
Vous pouvez diviser la migration en deux parties comme indiqué ci-dessous :
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. */ public function up(): void { Schema::create('customers', function (Blueprint $table) { $table->unsignedBigInteger('group_id')->nullable(); }); // Insert default data into the new column DB::raw('UPDATE customers, groups SET customers.group_id = groups.id WHERE customers.user_id = groups.user_id'); Schema::table('customers', function (Blueprint $table) { // Add the FK constraint $table->foreign('group_id')->references('id')->on(groups)->onDelete('cascade'); // Remove the nullable condition eventually; $table->unsignedBigInteger('group_id')->change(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::table('customers', function (Blueprint $table) { $table->dropForeign('group_id'); $table->dropColumn('group_id'); }); } };
Si vous souhaitez améliorer les performances de la base de données, vous pouvez consulter l'article ci-dessous sur les « Requêtes de base de données intelligentes » :
https://inspector.dev/how-to-accelerate-application-performance-with-smart-sql-queries/
Inspector est un outil de surveillance de l'exécution de code spécialement conçu pour les développeurs de logiciels. Vous n'avez pas besoin d'installer quoi que ce soit au niveau du serveur, installez simplement le package composer et vous êtes prêt à partir.
Contrairement à d'autres plates-formes complexes tout-en-un, Inspector est super simple et compatible PHP. Vous pouvez essayer notre package Laravel ou Symfony.
Si vous recherchez une automatisation efficace, des informations approfondies et la possibilité de transférer des alertes et des notifications dans votre environnement de messagerie, essayez Inspector gratuitement. Enregistrez votre compte.
Ou apprenez-en plus sur le site : https://inspector.dev
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!