MySQL 中使用 uuid 作为字段默认值

Tag: MySQL uuid 
Posted on 2020-07-22

UUID 基于 16 进制,由 32 位小写的 16 进制数字组成,如下:

aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee

MySQL 实现了 UUID,并且提供 UUID() 函数方便用户生成 UUID。在 MySQL 的 UUID() 函数中,前三组数字从时间戳中生成,第四组数字暂时保持时间戳的唯一性,第五组数字是一个 IEEE 802 节点标点值,保证空间唯一。使用 UUID() 函数,可以生成时间、空间上都独一无二的值。据说只要是使用了 UUID,都不可能看到两个重复的 UUID 值。当然,这个只是在理论情况下。

UUID 是 32 位,因为 MySQL 生成的 UUID 有四个中划线,所以在 utf8 字符集里,长度为 36 位。

在 MySQL 中创建表的时候,无法在默认值中设置UUID函数,实际上其它函数除TIMESTAMP之外都不可以。

所以,只能用触发器来实现。

首先,创建一个表:

CREATE TABLE `test` (
  `uuid` varchar(36) NOT NULL,
  `content` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`uuid`)
)

然后,创建一个触发器:

DELIMITER $$
 
CREATE
    TRIGGER `sddci`.`test` BEFORE INSERT
    ON `sddci`.`test`
    FOR EACH ROW BEGIN
        IF new.uuid='' OR new.uuid IS NULL THEN
            SET new.uuid = UUID();
        END IF;
    END$$

好了,测试一下触发器工作是否正常:

INSERT INTO `test` (content) VALUES ('www.aspone.me'); 
SELECT * FROM `test`;

结果出来了:

uuid	content
f6a57736-eb23-11e7-8ac5-525400ed11ea	www.aspone.me

完成

但是,MySQL 会返回一个警告:

1 queries executed, 1 success, 0 errors, 1 warnings
查询:insert into `test` (content) values ('www.aspone.me')
共 1 行受到影响, 1 个警告
执行耗时   : 0.025 sec
传送时间   : 0 sec
总耗时      : 0.025 sec
Warning Code : 1364
Field 'uuid' doesn't have a default value

当然,我们忽略这个警告,因为语句里并未写入主键 'uuid' 的值,这个值是在触发器里生成的。

 评论
张三
orz
李四
orz orz
李小四
orz orz orz
张小三
orz orz orz orz
  搜索
  Tags
全部   Ubuntu   Linux   Python   Windows   Shell   转发   字体   循环   js   KMS   MySQL   html   DNS   css   多线程   VSCode   Office   安装   WinSCP   字典   原创   多进程   反向代理   领带   截取字符   随机数   随机   重定向   远程调试   进程池   进度条   网卡   线程池   电源   生活   激活   浏览器   日志   数据库   venv   vbs   uuid   IP   iostat   import   GitHub   dpkg   DHCP   curl   crx   CPU   cloud-init   BBR   Apt   iptables   Kitsunebi   kvm   tc   subprocess   SSH   SoftEther   Set   samba   pyflakes   pip   Nginx   NextCloud   List   libreoffice   Adobe  
  功能
You can put anything you want inside of these side widgets. They are easy to use, and feature the new Bootstrap 4 card containers!