Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Поскольку 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
$$

Ответ 2

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