#mysql #uuid
#mysql #uuid
Вопрос:
Я пытаюсь добавить столбец в существующую таблицу в MySQL 8.0.17. Столбец должен содержать UUID, и я пытаюсь установить его в качестве значения по умолчанию.
Это оператор, который я выполняю
ALTER TABLE myTable ADD COLUMN UUID varchar(36) NOT NULL DEFAULT (UUID());
Однако я получаю следующую ошибку
Код ошибки: 1674. Оператор небезопасен, поскольку он использует системную функцию, которая может возвращать другое значение на подчиненном устройстве.
Я читал из других сообщений, что можно создать триггер в таблице, однако я хотел бы выяснить, можно ли установить его непосредственно в качестве значения по умолчанию для столбца.
Кроме того, в чем было бы преимущество использования двоичного преобразования UUID по сравнению с простым UUID?
Например.
ALTER TABLE myTable ADD COLUMN UUID binary(16) NOT NULL DEFAULT (UUID_TO_BIN(UUID(), true));
Спасибо за вашу помощь.
Ответ №1:
присвоение UUID()
значения по УМОЛЧАНИЮ не будет работать, поскольку это не гарантирует, что то же значение будет сгенерировано в вашей реплике. Вот почему использование ТРИГГЕРА является хорошим вариантом для новых записей (вставок).
Если вы намерены также обновить текущие записи, вы можете написать инструкцию update
update myTable
set UUID = UUID()
ваш столбец имеет тип binary(16)
, что означает, что данные UUID неявно преобразуются в двоичный. использование UUID_TO_BIN
не требуется.
Редактировать:
CHAR / VARCHAR — это формат, доступный для чтения человеком. в то время как двоичный файл является компактным форматом. Это означает сжатие 32 символов (36 или более с разделителями) в 16-битный формат или обратно в формат, понятный человеку.
Если вы не возражаете против чтения UUID, лучше всего использовать двоичный формат
Комментарии:
1. Привет, Дервис, спасибо за ваш ответ. Итак, вы предлагаете мне установить столбец как varchar(36) или binary(16)? И в чем преимущество одного перед другим? Спасибо.
2. Вы можете установить свой столбец так
CHAR(36)
, чтобы он всегда был одинаковой длины.3. CHAR / VARCHAR — это формат, доступный для чтения человеком. в то время как двоичный файл является компактным форматом. Если вы не возражаете против чтения UUID, лучше всего использовать двоичный формат
Ответ №2:
Измените VARCHAR на CHAR, это позволит вам использовать 16 бит.
Старый метод
ALTER TABLE myTable ADD COLUMN UUID varchar(36) NOT NULL DEFAULT (UUID());
Новый метод
ALTER TABLE myTable ADD COLUMN UUID BINARY(36) NOT NULL DEFAULT (UUID_TO_BIN(UUID()));
Комментарии:
1. Почему
BINARY(36)
для «нового метода»? IAFAIK aBINARY(16)
должно быть достаточно для UUID. Помимо разного размера, это именно то, что включено в вопрос, поэтому я не вижу, как это ответит на вопрос. Также16bit
может быть неправильным, может быть, вы имеете в виду16 bytes
?