Я хочу сделать что-то вроде этого:
create table app_users
(
app_user_id smallint(6) not null auto_increment primary key,
api_key char(36) not null default uuid()
);
Однако это приводит к ошибке, есть ли способ вызвать функцию для значения по умолчанию в mysql?
Спасибо.
SET new.api_key = COALESCE(new.api_key, uuid())
чтобы сохранить существующие ценности.Начиная с mysql v8.0.13, можно использовать выражение как значение по умолчанию для поля:
CREATE TABLE t1 ( uuid_field VARCHAR(32) DEFAULT (uuid()), binary_uuid BINARY(16) DEFAULT (UUID_TO_BIN(UUID())) );
источник
varchar(32)
должно бытьvarchar(36)
Как уже было сказано, вы не можете.
Если вы хотите смоделировать это поведение, вы можете использовать триггер следующим образом:
CREATE TRIGGER before_insert_app_users BEFORE INSERT ON app_users FOR EACH ROW IF new.uuid IS NULL THEN SET new.uuid = uuid(); END IF;
Вам все равно нужно обновить ранее существующие строки, например:
UPDATE app_users SET uuid = (SELECT uuid());
источник
К сожалению, нет, MySQL 5 требует констант по умолчанию. Более подробно вопрос обсуждался по ссылке ниже. Но единственный ответ - разрешить null и добавить триггер таблицы.
MySQL только недавно принял UUID как часть своего пакета БД, и он не так богат, как хотелось бы.
http://www.phpbuilder.com/board/showthread.php?t=10349169
источник
Я считаю, что вы не можете :
источник
getdate()
это даже не функция MySQL. Ссылка в ответе объясняет единственное исключение: «вы можете указать CURRENT_TIMESTAMP как значение по умолчанию для столбца TIMESTAMP» .Обратите внимание, что MySQL
UUID()
возвращаетCHAR(36)
и сохранение UUID в виде текста (как показано в других ответах), очевидно, неэффективно. Вместо этого столбец должен бытьBINARY(16)
, и его можно использоватьUUID_TO_BIN()
при вставке данных иBIN_TO_UUID()
при чтении их обратно.CREATE TABLE app_users ( app_user_id SMALLINT(6) NOT NULL AUTO_INCREMENT PRIMARY KEY, api_key BINARY(16) ); CREATE TRIGGER before_insert_app_users BEFORE INSERT ON app_users FOR EACH ROW IF new.api_key IS NULL THEN SET new.api_key = UUID_TO_BIN(UUID()); END IF;
Обратите внимание, что, поскольку MySQL на самом деле не знает, что это UUID, может быть сложно устранить проблемы с его сохранением в виде двоичного файла. В этой статье объясняется, как создать сгенерированный столбец, который будет преобразовывать UUID в текст по мере необходимости, не занимая места и не беспокоясь о синхронизации отдельных двоичных и текстовых версий: https://mysqlserverteam.com/storing-uuid-values-in -mysql-таблицы /
источник
Я не уверен, что приведенные выше ответы относятся к более старой версии, но я где-то видел, что вы можете сделать это с помощью функции unhex (). Я попробовал, и все работает. (Мария дб версия 10.2)
Ты можешь сделать
.... column_name binary(16) not null default unhex(replace(uuid(),'-',''))
и это работает. Чтобы увидеть uuid, просто введите hex (column_name).
источник
В MariaDB, начиная с версии 10.2.1, вы можете. См. Его документацию .
CREATE TABLE test ( uuid BINARY(16) PRIMARY KEY DEFAULT unhex(replace(uuid(),'-','')) ); INSERT INTO test () VALUES (); SELECT * FROM test;
источник