UUID по умолчанию для столбца идентификатора MySQL

#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 a BINARY(16) должно быть достаточно для UUID. Помимо разного размера, это именно то, что включено в вопрос, поэтому я не вижу, как это ответит на вопрос. Также 16bit может быть неправильным, может быть, вы имеете в виду 16 bytes ?