Soit le modèle relationnel des données suivant :
immeuble(id, adrNum, adrVoie, adrCodePostal, adrVille, fibreOptique, parkingPrivatif) Clef primaire : id (autoincrémenté) Remarque : tous les attributs sont non null, fibreOptique et parkingPrivatif sont de type booléen appartement(idImmeuble, numAppart, description, loyer, superficie, terrasse, classeConso, chauffage, placeParking, prixParking) Clef primaire : idImmeuble, numAppart Clef étrangère : idImmeuble en référence à immeuble(id) Remarque : attributs NULL par défaut, placeParking est de type booléen piece(idImmeuble, idAppartement, numPiece, superficie, fonction) Clef primaire : idImmeuble, idAppartement, numPiece Clef étrangère : (idImmeuble, idAppartement) en référence à appartement(idImmeuble, numAppart) Remarque : attributs NULL par défaut
DROP TRIGGER IF EXISTS prixAppartBeforeInsert; DELIMITER $$ CREATE TRIGGER prixAppartBeforeInsert BEFORE INSERT ON appartement FOR EACH ROW BEGIN IF NEW.placeParking = 0 THEN SET NEW.prixParking := NULL; -- affectation de variable END IF; END $$ DELIMITER ;
IF NEW.placeParking = 0 AND NEW.prixParking IS NOT NULL THEN -- Interrompt la transaction en levant une erreur, i.e. empêche l’insertion (ou la modification) SIGNAL sqlstate '45000' SET message_text ='prix parking sans parking'; END IF;
-- Insertion d'un immeuble INSERT INTO immeuble (Id, adrNum, adrVoie, adrCodePostal, adrVille, fibreOptique, parkingPrivatif) VALUES (1, '7', 'Place de l\'étoile', '45000', 'ORLEANS', 1, 1);
-- Insertion de deux appartements, l’un avec sans place de parking, l’autre avec une place de parking, et -- les deux ayant un prix de place de parking -- La première insertion doit échouer, la seconde réussir. INSERT INTO appartement (immeuble, num, description, loyer, superficie, terrasse, classeConso, chauffage, placeParking, prixParking) VALUES (1, 1, 'Appartement 1.1', 825.00, 86, 1, 'C', 'E', 0, 75.00), (1, 2, 'Appartement 1.2', 750.00, 86, 1, 'C', 'E', 1, 80.00);