MySQL - Изменить таблицу для автоматического ввода в UUID

14

Хорошо, я знаю, что делал это раньше. Но я не могу за всю жизнь понять это. Я создал таблицу. Один из столбцов помечен «LogID», это также первичный ключ.

Как мне изменить его, чтобы этот столбец генерировал UUID для каждой новой записи?

Благодарность

Мэтт Винер
источник

Ответы:

17

Просто создайте триггер для запуска перед вставкой, чтобы сгенерировать UUID для данного столбца.

CREATE TRIGGER before_insert_mytable
  BEFORE INSERT ON mytable
  FOR EACH ROW
  SET new.LogID = uuid();
Роберт Габриэль
источник
3

UUID () выражение генерирует UUID при вызове.

К сожалению (AFAIK в любом случае) MySQL не допускает выражения в качестве значения по умолчанию для поля. В качестве обходного пути вы всегда можете установить для поля значение по умолчанию null и иметь триггер, который обновляет поле с UUID при вставке.

ydaetskcoR
источник
2

Я уверен, что ты все еще не можешь , на самом деле. Я бы серьезно подумал не использовать UUID в качестве первичного ключа, вместо этого использовать более тонкий и приятный тип данных, как INT. Вы можете добавить свой UUID в виде отдельного столбца и обновить его через TRIGGER, если это вас устраивает.

Avarkx
источник
Целые числа ломаются, если вам нужно, чтобы записи были уникальными в вашей базе данных.
Cfreak
1
Я подозреваю, что существует проблема с более крупным дизайном модели или выбранным инструментом, если требования определяют модель хранения двигателя на этом уровне. В этом случае наличие UUID в виде отдельного столбца является лучшим решением для обоих миров.
Аварккс,
UUID раздувается, когда он отформатирован для людей. Если вы хотите использовать UUID в качестве первичного ключа, то удалите дефисы и снимите его. Если вам нужна версия в формате человека, вы можете добавить сгенерированный столбец в таблицу. SELECT LENGTH(UNHEX(REPLACE(UUID(),'-','')))= 16 байт двоичного файла. Все еще больше, INTно гораздо лучше, чемVARCHAR(36)
miknik
Плохой совет, микник. Ваша база данных будет ужасно масштабироваться, если вы будете использовать UUID в качестве первичного ключа. Также может иметь 16 отдельных целочисленных столбцов в качестве составного первичного ключа. И индекс фрагментации в изобилии! Ваш первичный ключ теперь случайный. Если вы делаете, не используйте внешние ключи. Соединения изменяются с O (n) на O (n ^ 2). Два соединения от O (n log10 (n)) до O (n ^ 3). Замените n на 100 000 и вычтите разницу.
TamusJRoyce
2

Я просто решил включить команду UUID () на вставку из моего приложения.

Спасибо всем.

Мэтт Винер
источник