"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > [Résolu] Violation des contraintes d'intégrité – Conseils rapides

[Résolu] Violation des contraintes d'intégrité – Conseils rapides

Publié le 2024-08-25
Parcourir:776

Si vous rencontrez l'erreur : "Violation de la 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 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 des 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 et 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.

Comment résoudre l'erreur de violation d'intégrité

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'avec le group_id nullable, votre base de données n'est pas consciente 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.

Migration de données

Une autre solution consiste à ajouter une tâche 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 ID 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;

Utiliser les migrations Laravel

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/

Nouveau comme inspecteur ? Surveillez votre candidature gratuitement

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 extrêmement simple et compatible avec 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

[Resolved] Integrity constraint violation – Fast tips

Déclaration de sortie Cet article est reproduit sur : https://dev.to/inspector/resolved-integrity-constraint-violation-fast-tips-9eb?1 En cas d'infraction, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3