MySQL-修改表以自动放入UUID


14

好的,我知道我以前做过。但是我无法为自己的生活弄清楚。我创建了一张桌子。列之一标记为“ LogID”,它也是主键。

如何更改它,以便此列为每个新条目生成一个UUID?

谢谢

Answers:


17

只需插入之前创建要运行的触发器即可为给定的列生成UUID。

CREATE TRIGGER before_insert_mytable
  BEFORE INSERT ON mytable
  FOR EACH ROW
  SET new.LogID = uuid();

3

UUID()被调用时表达产生一个UUID。

不幸的是(无论如何还是AFAIK),MySQL不允许将表达式作为字段的默认值。解决方法是,您始终可以将字段设置为默认null并使用触发器在插入时使用UUID更新该字段。


2

我敢肯定,实际上您还是不能。我会认真考虑使用UUID作为主键,而是使用更苗条,更好的数据类型,例如INT。您可以将UUID添加为单独的列,并通过进行更新TRIGGER(如果适合)。


如果需要在整个数据库中唯一的记录,则整数会细分。
Cfreak

1
如果需求决定该级别的发动机存储模式,我会怀疑会有更大的模型设计或所选的工具问题。在这种情况下,将UUID作为单独的列实际上是两全其美的解决方案。
Avarkx 2015年

一旦为人类格式化,UUID就会肿。如果要使用UUID作为主键,则请删除破折号并将其取消十六进制。如果您需要人类格式的版本,则可以在表中添加一个生成的列。SELECT LENGTH(UNHEX(REPLACE(UUID(),'-','')))= 16字节二进制。仍然比INT但更大,但更好VARCHAR(36)
miknik

不好的建议,米尼克。如果您使用UUID作为主键,则数据库将极大地扩展。可能还有16个单独的整数列作为复合主键。和索引碎片化的豪放!您的主键现在是随机的。如果这样做,请不要使用外键。连接从O(n)变为O(n ^ 2)。从O(n log10(n))到O(n ^ 3)的两个联接。将n替换为100,000,然后减去差值。
TamusJRoyce

2

我只是决定在应用程序的插入内容中包含UUID()命令。

谢谢大家

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.