Previous answer n'est pas tout à fait raison - vous devez être prudent avec les déclencheurs ... ils seront effectivement remplacer une valeur par défaut que vous passez si utilisé comme dans cet exemple. Tout ira bien quand la clé primaire n'est pas définie, mais si vous en passez une avec l'INSERT, elle sera effacée avec une nouvelle clé aléatoire par le déclencheur.
Pour que cela fonctionne correctement, vous devez vérifier si le champ a déjà une valeur avant d'attribuer un nouveau, comme suit:
DELIMITER ;;
CREATE TRIGGER `sometrigger`
BEFORE INSERT ON `sometable`
FOR EACH ROW
BEGIN
IF ASCII(NEW.uuid) = 0 THEN
SET NEW.uuid = UNHEX(REPLACE(UUID(),'-',''));
END IF;
SET @last_uuid = NEW.uuid;
END
;;
J'utilise ASCII()
pour vérifier la nouvelle valeur du champ, comme ASCII()
retournera 0 pour une chaîne vide, que les données soient au format textuel ou binaire (et une chaîne vide est la valeur par défaut pour les champs sans ensemble par défaut). J'utilise également binaire (16) pour stocker mes UUID pour l'espace de stockage le plus efficace et la vitesse de requête ... si vous ne voulez pas faire face à la complexité des champs binaires alors vous pouvez simplement utiliser UUID()
au lieu de UNHEX(REPLACE(UUID(),'-',''))
avec un champ (36).
un déclencheur? l'homme c'est moche :) merci! – Blankman
+1 - Vous avez répondu à ma question, qui était complètement différente de l'original - mais j'apprécie tout de même! – Fenton