la valeur par défaut de GUID dans une colonne mysql
Je veux une colonne à défaut d'un GUID, donc si je fais un insert et je n'ai pas de définir explicitement la valeur, je le veux à défaut d'une nouvelle valeur GUID.
Être que l'UUID() n'est pas accepté comme une contrainte par DÉFAUT, vous devez utiliser un déclencheur.
Cela on définit la valeur de la NEW_TABLE.uuid colonne:
delimiter $$CREATE
DEFINER=`root`@`localhost`TRIGGER`example`.`newid`
BEFORE INSERTON`example`.`new_table`FOR EACH ROWBEGINSET NEW.`uuid`= UUID();END$$
un déclencheur? l'homme qui est moche 🙂 merci! +1 - Vous avez répondu à ma question, qui est complètement différent de l'original, mais je l'apprécie tout de même!
Réponse précédente n'est pas tout à fait raison: il faut être très prudent avec les déclencheurs... ils vont réellement remplacer toute la valeur par défaut que vous transmettez s'il est utilisé dans cet exemple. Tout fonctionne bien lorsque la clé primaire n'est pas défini, mais si vous passez de l'un avec l'INSERT, il obtiendra les essuyer avec un nouveau de manière aléatoire par le déclencheur.
Pour qu'il fonctionne correctement vous devez vérifier si le domaine a déjà une valeur avant l'attribution d'un nouveau, comme suit:
DELIMITER ;;CREATETRIGGER`sometrigger`
BEFORE INSERTON`sometable`FOR EACH ROWBEGINIF ASCII(NEW.uuid)=0THENSET NEW.uuid = UNHEX(REPLACE(UUID(),'-',''));ENDIF;SET@last_uuid = NEW.uuid;END;;
- Je utiliser ASCII() pour vérifier la nouvelle valeur du champ, comme ASCII() sera de retour 0 pour une chaîne vide si les données en texte ou en format binaire (et une chaîne vide est la valeur par défaut pour les champs ayant pas de valeur par défaut). J'utilise aussi binaire(16) pour stocker mes UUID pour plus efficace de l'espace de stockage et la vitesse des requêtes... si vous ne voulez pas faire face à la complexité de champs binaires, alors vous pouvez simplement utiliser UUID() en place de UNHEX(REPLACE(UUID(),'-','')) avec un char(36) champ.
Être que l'UUID() n'est pas accepté comme une contrainte par DÉFAUT, vous devez utiliser un déclencheur.
Cela on définit la valeur de la
NEW_TABLE.uuid
colonne:+1 - Vous avez répondu à ma question, qui est complètement différent de l'original, mais je l'apprécie tout de même!
OriginalL'auteur OMG Ponies
Réponse précédente n'est pas tout à fait raison: il faut être très prudent avec les déclencheurs... ils vont réellement remplacer toute la valeur par défaut que vous transmettez s'il est utilisé dans cet exemple. Tout fonctionne bien lorsque la clé primaire n'est pas défini, mais si vous passez de l'un avec l'INSERT, il obtiendra les essuyer avec un nouveau de manière aléatoire par le déclencheur.
Pour qu'il fonctionne correctement vous devez vérifier si le domaine a déjà une valeur avant l'attribution d'un nouveau, comme suit:
- Je utiliser
ASCII()
pour vérifier la nouvelle valeur du champ, commeASCII()
sera de retour 0 pour une chaîne vide si les données en texte ou en format binaire (et une chaîne vide est la valeur par défaut pour les champs ayant pas de valeur par défaut). J'utilise aussi binaire(16) pour stocker mes UUID pour plus efficace de l'espace de stockage et la vitesse des requêtes... si vous ne voulez pas faire face à la complexité de champs binaires, alors vous pouvez simplement utiliserUUID()
en place deUNHEX(REPLACE(UUID(),'-',''))
avec un char(36) champ.OriginalL'auteur pospi