Могу ли я использовать функцию для значения по умолчанию в 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 62

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 как часть своего пакета БД, и это не так многофункционально, как хотелось бы.

http://www.phpbuilder.com/board/showthread.php?t=10349169

Я считаю вы можете:

значение по умолчанию должно быть константой; оно не может быть функцией или выражением

Я не уверен, что приведенные выше ответы предназначены для более старой версии, но я где-то видел, что вы можете сделать это с помощью функции 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;