mysql中一列的GUID的默认值

时间:2010-10-30 02:48:15

标签: sql mysql guid default uuid

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

我该怎么做?

2 个答案:

答案 0 :(得分: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
$$

答案 1 :(得分:9)

Previous answer不太正确 - 您必须小心触发器...如果在该示例中使用,它们实际上会覆盖您传入的任何默认值。当未设置主键时,一切都会正常工作,但如果你使用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
;;

我使用ASCII()检查新字段值,因为ASCII()将为空字符串返回0,无论数据是文本格式还是二进制格式(空字符串是字段的默认值)没有默认设置)。我还使用二进制(16)来存储我的UUID,以获得最有效的存储空间和查询速度......如果您不想处理二进制字段的复杂性,那么您只需使用{{ 1}}代替带有 char(36)字段的UUID()