значение по умолчанию 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)