2010-10-30 7 views

Répondre

9

Etre UUID() n'est pas accepté comme une contrainte DEFAULT, vous devez utiliser un déclencheur.

Celui-ci définit la valeur de la colonne NEW_TABLE.uuid:

delimiter $$ 

CREATE 
DEFINER=`root`@`localhost` 
TRIGGER `example`.`newid` 
BEFORE INSERT ON `example`.`new_table` 
FOR EACH ROW 
BEGIN 
    SET NEW.`uuid` = UUID(); 
END 
$$ 
+1

un déclencheur? l'homme c'est moche :) merci! – Blankman

+0

+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

8

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).

Questions connexes