我想要一个列默认为GUID,所以如果我正在进行插入并且我没有显式设置该值,我希望它默认为新的GUID值。
我该怎么做?
答案 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()
。