我可以在MySql中使用函数作为默认值吗?

mma*_*tax 81 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中调用函数作为默认值?

谢谢.

小智 117

不,你不能.

但是,您可以轻松创建触发器来执行此操作,例如:

CREATE TRIGGER before_insert_app_users
  BEFORE INSERT ON app_users 
  FOR EACH ROW
  SET new.api_key = uuid();

  • @参见 http://stackoverflow.com/questions/6280789/generate-guid-in-mysql-for-existing-data 以在现有行中填充 UUID。 (2认同)
  • 这与具有DEFAULT值不完全相同.如果值为NULL,如何将此答案更改为仅设置键? (2认同)
  • SET SET new.api_key = COALESCE(new.api_key,uuid())保留现有值。 (2认同)
  • 这不是真的。可以将函数设置为默认值......至少现在是这样。该答案必须更新才能保持其“正确答案”状态 (2认同)

Pam*_*put 19

如前所述,你不能.

如果要模拟此行为,可以使用以下方式触发:

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;
Run Code Online (Sandbox Code Playgroud)

您仍然需要更新以前存在的行,如下所示:

UPDATE app_users SET uuid = (SELECT uuid());
Run Code Online (Sandbox Code Playgroud)


Sha*_*dow 16

mysql v8.0.13开始,可以使用表达式作为字段的默认值:

DEFAULT子句中指定的默认值可以是文字常量或表达式.除了一个例外,将表达式默认值括在括号内,以将它们与文字常量默认值区分开来.

CREATE TABLE t1 (
  uuid_field     VARCHAR(32) DEFAULT (uuid()),
  binary_uuid    BINARY(16)  DEFAULT (UUID_TO_BIN(UUID()))
);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,根据答案中已链接的文档:_...不允许存储函数和用户定义的函数_。即,唯一可以用作默认表达式的函数是内置函数。 (4认同)
  • 截至 2020 年 5 月,这应该是正确的答案。使用触发器的其他答案已过时。 (3认同)
  • 一个小细节:“varchar(32)”应该是“varchar(36)” (2认同)
  • @JohnStock此方法不允许使用用户定义或存储的函数,因此声明触发器的使用已过时可能有点过早。 (2认同)

Tra*_*isO 8

不幸的是,MySQL 5需要默认的常量.在下面的链接中更详细地讨论了该问题.但唯一的答案是允许null并添加表触发器.

MySQL最近才接受UUID作为其数据库包的一部分,它并不像我们想要的那样功能丰富.

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


Thi*_*ère 6

我相信你不能:

默认值必须是常量; 它不能是一个功能或表达

  • @amrosama - 不,你不能.`getdate()`甚至不是MySQL函数.答案中的链接解释了唯一的例外:*«您可以指定CURRENT_TIMESTAMP作为TIMESTAMP列的默认值»*. (6认同)
  • 从技术上讲,我会说AUTO_INCREMENT也可以看作是动态设置默认值的"函数". (3认同)
  • CURRENT_TIMESTAMP 是唯一可以用作默认值的“函数”。其他一切都必须是常数(不幸的是)。 (2认同)