Puisque MySQL n'applique pas les contraintes de vérification, vous pouvez en émuler une avec un déclencheur. Je suggérerais vérifier cet article MySQL Forge:
L'idée est de déplacer votre logique de contrôle à un déclencheur. Si la vérification échoue, appelez une procédure stockée qui échoue en levant une violation de clé unique. Cela nous permet de renvoyer un message d'erreur descriptif au client.
Votre déclencheur sera probablement quelque chose comme ceci:
DELIMITER $$
CREATE TRIGGER check_not_all_null BEFORE INSERT ON your_table FOR EACH ROW
BEGIN
IF COALESCE(field_1, field_2, field_3) IS NOT NULL THEN
CALL fail('All fields cannot be null');
END IF;
END $$
DELIMITER ;
Nous devons faire le nécessaire fail
sproc soulever une violation de clé unique afin d'avoir le INSERT
avorté lorsque la vérification échoue. L'article ci-dessus mentionné suggère la création d'une table de mémoire définie comme suit:
CREATE TABLE `Error` (
`ErrorGID` int(10) unsigned NOT NULL auto_increment,
`Message` varchar(128) default NULL,
`Created` timestamp NOT NULL default CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`ErrorGID`),
UNIQUE KEY `MessageIndex` (`Message`)
) ENGINE=MEMORY DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED
Alors le fail
sproc pourrait être mis en œuvre comme suit:
DELIMITER $$
CREATE PROCEDURE `fail`(_message VARCHAR(128))
BEGIN
INSERT INTO error (message) VALUES (_message);
INSERT INTO error (message) VALUES (_message);
END$$
DELIMITER ;
Le double INSERT
veillera à ce que la violation clé unique est soulevée. Si le même message existe déjà dans la table, la violation sera levée sur le premier INSERT
, mais cela n'a pas d'importance tant qu'il échoue.
On peut essayer le fail
sproc de la ligne de commande:
mysql> CALL fail('All fields cannot be null');
ERROR 1062 (23000): Duplicate entry 'All fields cannot be null' for key 2
Les bonnes nouvelles sont que nous revenions un message d'erreur lisible. Cependant, nous ne récupérons pas le code d'erreur correct, et nous n'avons pas vraiment de "doublon". Il s'agit évidemment d'une limitation de cette méthode, notamment lors de la mise à jour ou de l'insertion d'enregistrements dans une procédure qui utilise la gestion des erreurs, notamment en traitant spécifiquement l'erreur 1062 Duplicate Entry
.
WOW! Merci beaucoup pour cette réponse détaillée !! :-) – ssc