MySQL - Modifier la table pour mettre automatiquement un UUID

14

Ok, je sais que je l'ai déjà fait. Mais je ne peux pas le comprendre pour la vie de moi. J'ai créé une table. L'une des colonnes est intitulée "LogID", c'est aussi la clé primaire.

Comment puis-je le modifier pour que cette colonne génère un UUID pour chaque nouvelle entrée?

Merci

Matt Winer
la source

Réponses:

17

Créez simplement un déclencheur à exécuter avant l' insertion pour générer l'UUID pour la colonne donnée.

CREATE TRIGGER before_insert_mytable
  BEFORE INSERT ON mytable
  FOR EACH ROW
  SET new.LogID = uuid();
Robert Gabriel
la source
3

L' expression UUID () génère un UUID lorsqu'elle est appelée.

Malheureusement (AFAIK de toute façon) MySQL n'autorisera pas les expressions comme valeur par défaut pour un champ. Comme solution de contournement, vous pouvez toujours définir le champ sur null par défaut et avoir un déclencheur qui met à jour le champ avec un UUID lors de l'insertion.

ydaetskcoR
la source
2

Je suis sûr que vous ne pouvez toujours pas , en fait. J'envisagerais sérieusement de ne pas utiliser un UUID comme clé primaire, plutôt d'utiliser un type de données plus mince et plus agréable comme INT. Vous pouvez ajouter votre UUID dans une colonne distincte et le mettre à jour via un TRIGGER, si cela vous convient.

Avarkx
la source
Les entiers se décomposent si vous avez besoin que les enregistrements soient uniques dans votre base de données.
Cfreak
1
Je soupçonne qu'il y a une conception de modèle plus grande ou un problème d'outil choisi si les exigences dictent le modèle de stockage du moteur à ce niveau. La présence de l'UUID dans une colonne distincte est en fait la meilleure des deux solutions dans ce cas.
Avarkx
UUID est gonflé une fois formaté pour les humains. Si vous souhaitez utiliser un UUID comme clé primaire, supprimez les tirets et décompressez-le. Si vous avez besoin de la version au format humain, vous pouvez ajouter une colonne générée au tableau. SELECT LENGTH(UNHEX(REPLACE(UUID(),'-','')))= 16 octets binaires. Toujours plus grand INTmais bien meilleur queVARCHAR(36)
miknik
Mauvais conseil, miknik. Votre base de données évoluera terriblement si vous utilisez un UUID comme clé primaire. Autant avoir 16 colonnes entières distinctes comme clé primaire composée. Et indexez la fragmentation à gogo! Votre clé primaire est désormais aléatoire. Si vous le faites, n'utilisez pas de clés étrangères. Les jointures changent de O (n) à O (n ^ 2). Deux jointures de O (n log10 (n)) à O (n ^ 3). Remplacez n par 100 000 et soustrayez la différence.
TamusJRoyce
2

Je viens de décider d'inclure la commande UUID () sur l'insert de mon application.

Merci a tous.

Matt Winer
la source