Могу ли я использовать функцию для значения по умолчанию в MySql?
Я хочу сделать что-то вроде этого:
create table app_users
(
app_user_id smallint(6) not null auto_increment primary key,
api_key char(36) not null default uuid()
);
однако это приводит к ошибке, есть ли способ, чтобы вызвать функцию для значения по умолчанию в MySQL?
спасибо.
7 ответов:
Как уже говорилось, Вы не можете.
Если вы хотите имитировать это поведение, вы можете использовать триггер следующим образом:
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 как часть своего пакета БД, и это не так многофункционально, как хотелось бы.
Я считаю вы можете:
значение по умолчанию должно быть константой; оно не может быть функцией или выражением
Я не уверен, что приведенные выше ответы предназначены для более старой версии, но я где-то видел, что вы можете сделать это с помощью функции unhex (). Я попробовал, и это работает. (maria db version 10.2)
можно сделать
.... column_name binary(16) not null default unhex(replace(uuid(),'-',''))
и это работает. Чтобы увидеть uuid, просто сделайте hex (column_name).
обратите внимание, что MySQL
UUID()
возвращаетCHAR(36)
, и хранение UUIDs в виде текста (как показано в других ответах), очевидно, неэффективно. Вместо этого столбец должен быть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-tables/
в MariaDB начиная с версии 10.2.1 вы можете. Смотрите документация.
CREATE TABLE test ( uuid BINARY(16) PRIMARY KEY DEFAULT unhex(replace(uuid(),'-','')) ); INSERT INTO test () VALUES (); SELECT * FROM test;