Voyons ensemble les erreurs classiques quand tu ajoutes de nouvelles données dans une table.
Erreur 1 : Tentative d'insérer NULL dans un champ obligatoire
PostgreSQL surveille bien que les règles de la base soient respectées. Voilà des exemples de contraintes qui peuvent te faire planter :
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL, -- Le nom ne peut pas être NULL
age INT
);
-- Erreur : le champ name est obligatoire
INSERT INTO students (name, age) VALUES (NULL, 20);
Résultat : erreur null value in column "name" of relation "students" violates not-null constraint`.
Fais gaffe à ce que tu ajoutes comme données. Peut-être que cette colonne acceptait NULL avant, mais maintenant c'est obligatoire.
Erreur 2 : Duplication de données dans une colonne unique.
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY,
course_name TEXT UNIQUE -- Le nom du cours doit être unique
);
-- Première insertion OK
INSERT INTO courses (course_name) VALUES ('SQL Basics');
-- Deuxième insertion provoque une erreur
INSERT INTO courses (course_name) VALUES ('SQL Basics');
Résultat : erreur duplicate key value violates unique constraint`.
En général, ce n'est pas ta faute, c'est l'utilisateur qui essaie de refaire une action par erreur. Pas besoin de faire quoi que ce soit dans ce cas.
Erreur 3 : Violation de l'intégrité référentielle.
CREATE TABLE enrollments (
enrollment_id SERIAL PRIMARY KEY,
student_id INT REFERENCES students(id), -- Il doit exister un étudiant avec cet ID
course_id INT REFERENCES courses(course_id)
);
-- Erreur : l'étudiant avec ID = 99 n'existe pas
INSERT INTO enrollments (student_id, course_id) VALUES (99, 1);
Résultat : erreur insert or update on table "enrollments" violates foreign key constraint`.
C'est super qu'il y ait une erreur. Y'a rien de pire que de casser l'intégrité de la base. Probablement qu'il y a une erreur dans le code qui gère la base, ou alors des données sont obsolètes. Bref, si la base n'a pas laissé casser son intégrité — c'est top.
Gestion des erreurs dans PostgreSQL
Ouais, les erreurs arrivent. Mais l'important, c'est pas juste de les voir, c'est de savoir quoi en faire.
Les transactions comme outil de protection
Quand on manipule des données, on utilise souvent des transactions pour garantir la cohérence. Si une erreur arrive, on peut annuler les changements.
Exemple : ajout de données dans deux tables.
BEGIN; -- On démarre une transaction
-- On insère des données dans la table students
INSERT INTO students (name, age) VALUES ('Otto Lin', 21);
-- On insère une ligne dans enrollments
-- Ici, ça plante si le cours avec ID=10 n'existe pas
INSERT INTO enrollments (student_id, course_id) VALUES (1, 10);
-- Si tout s'est bien passé
COMMIT;
-- Si y'a eu une erreur, on "rollback"
ROLLBACK;
Si le cours avec course_id = 10 n'existe pas, l'insertion dans la table students sera aussi annulée.
Gestion des erreurs dans les transactions
Dans PostgreSQL, tu peux anticiper les erreurs et les gérer direct dans les requêtes avec les blocs EXCEPTION.
Exemple : on ajoute un étudiant et on l'inscrit à un cours. Si ça plante, on log l'erreur.
DO $$
BEGIN
-- On tente d'insérer les données
INSERT INTO students (name, age) VALUES ('Anna Song', 22);
INSERT INTO enrollments (student_id, course_id) VALUES (2, 999); -- Erreur
-- Si tout est OK
RAISE NOTICE 'Enregistrement ajouté avec succès !';
EXCEPTION
WHEN foreign_key_violation THEN
-- On gère la violation de clé étrangère
RAISE WARNING 'Le cours avec ce course_id n\'existe pas.';
END $$;
Vérification d'unicité avec ON CONFLICT
Tu peux éviter à l'avance l'erreur liée à la contrainte UNIQUE grâce à ON CONFLICT. Ça te permet de dire quoi faire en cas de conflit.
Exemple : si on essaie d'insérer un cours déjà existant, on saute l'insertion.
INSERT INTO courses (course_name)
VALUES ('SQL Basics')
ON CONFLICT (course_name) DO NOTHING; -- Sauter les doublons
Ou alors on met à jour la ligne existante :
INSERT INTO courses (course_name)
VALUES ('SQL Basics')
ON CONFLICT (course_name) DO UPDATE
SET course_name = EXCLUDED.course_name || ' (Mis à jour)';
Je te parlerai plus en détail de ON CONFLICT au prochain niveau, quand on verra le chargement massif de données :P
Erreurs classiques de gestion des données et comment les éviter
Tu l'as vu, les principales sources d'erreurs, c'est :
- Violation de contraintes (
NOT NULL,UNIQUE,FOREIGN KEY). - Oubli de conditions dans les requêtes (
WHERE) lors des updates ou deletes. - Erreurs dans l'ordre des transactions.
Pour te protéger :
- Utilise les transactions et
ROLLBACKpour les grosses opérations. - Vérifie toujours les données avant d'insérer.
- Loggue les erreurs pour les analyser.
- Utilise
ON CONFLICTpour éviter les doublons.
Maintenant t'as les armes pour te battre contre les erreurs ! Rappelle-toi : un bon dev, c'est pas celui qui fait jamais d'erreurs, c'est celui qui sait les corriger.
GO TO FULL VERSION