Я хочу, чтобы столбец по умолчанию был GUID, поэтому, если я делаю вставку, и я явно не задал значение, я хочу, чтобы оно по умолчанию было новым значением GUID.
как я могу это сделать?
Я хочу, чтобы столбец по умолчанию был GUID, поэтому, если я делаю вставку, и я явно не задал значение, я хочу, чтобы оно по умолчанию было новым значением GUID.
как я могу это сделать?
Поскольку 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
$$
Предыдущий ответ не совсем прав - вы должны быть осторожны с триггерами... они фактически перезаписывают любое значение по умолчанию, которое вы передаете, если оно используется в это пример. Все будет работать нормально, если первичный ключ не установлен, но если вы пройдете один с помощью 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).