значение по умолчанию GUID in для столбца в mysql

Я хочу, чтобы столбец по умолчанию был GUID, поэтому, если я делаю вставку, и я явно не устанавливаю значение, я хочу, чтобы по умолчанию было новое значение GUID.

Как я могу это сделать?

2 ответов


поскольку UUID () не принимается в качестве ограничения по умолчанию, вам нужно использовать триггер.

этот задает значение для :

delimiter $$

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

предыдущий ответ Не совсем верно - вы должны быть осторожны с триггерами... они фактически перезапишут любое значение по умолчанию, которое вы передадите, если оно используется, как в этом примере. Все будет работать нормально, когда первичный ключ не установлен, но если вы передадите его с помощью вставки, он будет стерт новым случайным триггером.

чтобы он работал правильно, вы должны проверить, имеет ли поле уже значение перед назначением нового, как следует:

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 для пустой строки, независимо от того, находятся ли данные в текстовом или двоичном формате (и пустая строка является значением по умолчанию для полей без набора по умолчанию). Я также использую binary (16) для хранения моего UUID для наиболее эффективного пространства для хранения и скорости запроса... если вы не хотите иметь дело со сложностями двоичных полей, вы можете просто использовать UUID() на месте UNHEX(REPLACE(UUID(),'-','')) С a char (36)