Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在MySql中使用函数作为默认值吗?_Mysql - Fatal编程技术网

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

我可以在MySql中使用函数作为默认值吗?,mysql,Mysql,我想这样做: create table app_users ( app_user_id smallint(6) not null auto_increment primary key, api_key char(36) not null default uuid() ); UPDATE app_users SET uuid = (SELECT uuid()); 然而,这会导致一个错误,有没有办法在mysql中为默认值调用函数 谢谢。不幸的是,MySQL 5需要常量作

我想这样做:


create table app_users
(
    app_user_id smallint(6) not null auto_increment primary key,
    api_key     char(36) not null default uuid()
);
UPDATE app_users SET uuid = (SELECT uuid());
然而,这会导致一个错误,有没有办法在mysql中为默认值调用函数


谢谢。

不幸的是,MySQL 5需要常量作为默认值。这个问题在下面的链接中进行了更详细的讨论。但唯一的答案是允许null并添加一个表触发器

MySQL最近才接受UUID作为其DB包的一部分,而且它并不像我们希望的那样功能丰富

不,你不能

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

CREATE TRIGGER before_insert_app_users BEFORE INSERT ON app_users FOR EACH ROW SET new.api_key = uuid(); 在用户插入应用程序之前创建触发器 在应用程序用户上插入之前 每行 设置new.api_key=uuid(); 我相信:

默认值必须是常量;它不能是函数或表达式


如前所述,你不能

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

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;
您仍然需要更新以前存在的行,如下所示:


create table app_users
(
    app_user_id smallint(6) not null auto_increment primary key,
    api_key     char(36) not null default uuid()
);
UPDATE app_users SET uuid = (SELECT uuid());

我不确定上面的答案是否适用于较旧的版本,但我发现可以使用unhex()函数实现这一点。我试过了,效果很好。(maria db 10.2版)

你能行

.... column_name binary(16) not null default unhex(replace(uuid(),'-',''))   

它是有效的。要查看uuid,只需执行十六进制(列名称)

注意,MySQL的
UUID()
返回
CHAR(36)
,将UUID存储为文本(如其他答案所示)显然效率低下。相反,列应该是
BINARY(16)
,插入数据时可以使用
UUID\u TO\u BIN()
,读回数据时可以使用
BIN\u TO\u 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进行故障排除。本文解释了如何创建一个生成的列,该列将根据需要将UUID转换为文本,而不占用任何空间或担心保持二进制和文本版本的同步:

在MariaDB中,从10.2.1版开始,您可以。看

从开始,可以使用表达式作为字段的默认值:

default子句中指定的默认值可以是文字常量或表达式。除了一个例外,将表达式默认值括在括号内,以区别于文字常量默认值


不正确,您可以使用getdate()@amrosama-不,您不能
getdate()
甚至不是MySQL函数。答案中的链接解释了唯一的例外情况:«您可以将当前时间戳指定为时间戳列的默认值»。当前时间戳是唯一可以用作默认值的“函数”。所有的其他事物都必须是一个常数(不幸的是)。技术上,我认为AutoYLoad也可以被看作是一个“动态”设置默认值的“函数”。我应该补充一下,允许NULL和依赖触发器可能是有效的,但是大多数开发人员会认为它是一个非常复杂的解决方案。我个人不推荐它,但推荐给每个人自己的。@请参阅在现有行中填充UUID的详细信息。这与使用默认值不同。如果值为NULL,如何将这个答案更改为只设置键?遗憾的是,MySQL已经存在了这么长时间,但是如果没有触发器,就无法为列实现默认UUID。原因是嵌入在20世纪80年代的技术中,该技术显然仍然存在于MySQL基本代码中(搜索“我们不能拥有美好的东西”):@RodolVelasco uuid函数被构建为具有高度的抗冲突性。比md5更重要。一旦md5 uuid,您就有更高的id冲突风险
设置new.api_key=COALESCE(new.api_key,uuid())
,以保留现有值。请注意,根据回答中已链接的文档:。。。不允许使用存储函数和用户定义函数。也就是说,唯一可用作默认表达式的函数是内置函数。从2020年5月起,这应该是正确答案。使用触发器的其他答案已经过时。一个次要细节:
varchar(32)
应该是
varchar(36)
@JaredBeck我认为如果不存储破折号,32就可以了。@JohnStock此方法不允许使用用户定义或存储的函数,因此宣布使用触发器过时可能有点为时过早。