ASPONE.CN
苦逼

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

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`;


结果出来了:

uuidcontent
f6a57736-eb23-11e7-8ac5-525400ed11eawww.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' 的值,这个值是在触发器里生成的。

Copyright © 2016 ASPONE.CN. All Rights Reserved. 京ICP备18038662号