mysql中一列的GUID的默认值

Bla*_*man 11 mysql sql uuid default guid

我想要一个列默认为GUID,所以如果我正在进行插入并且我没有显式设置该值,我希望它默认为新的GUID值.

我怎样才能做到这一点?

OMG*_*ies 11

由于UUID()不被接受为DEFAULT约束,因此您需要使用触发器.

这个设置NEW_TABLE.uuid列的值:

delimiter $$

CREATE
DEFINER=`root`@`localhost`
TRIGGER `example`.`newid`
BEFORE INSERT ON `example`.`new_table`
FOR EACH ROW
BEGIN
  SET NEW.`uuid` = UUID();
END
$$
Run Code Online (Sandbox Code Playgroud)


pos*_*spi 9

以前的答案并不完全正确 - 您必须小心触发器...如果在该示例中使用,它们实际上将覆盖您传入的任何默认值.当未设置主键时,一切都会正常工作,但是如果你使用INSERT传入一个,它将被触发器用新的随机键擦除.

为了使其正常工作,您必须在分配新字段之前检查该字段是否已具有值,如下所示:

DELIMITER ;;
CREATE TRIGGER `sometrigger` 
BEFORE INSERT ON `sometable` 
FOR EACH ROW 
BEGIN 
    IF ASCII(NEW.uuid) = 0 THEN 
        SET NEW.uuid = UNHEX(REPLACE(UUID(),'-','')); 
    END IF; 
    SET @last_uuid = NEW.uuid; 
END
;;
Run Code Online (Sandbox Code Playgroud)

ASCII()用来检查新的字段值,因为ASCII()对于空字符串将返回0,无论数据是文本格式还是二进制格式(空字符串是没有默认设置的字段的默认值).我也用二进制(16)来存储我的UUID对最有效的存储空间和查询速度......如果你不想处理二进制领域的复杂性,那么你可以简单地使用UUID()代替UNHEX(REPLACE(UUID(),'-',''))CHAR(36)领域.