MySQL 设置默认 ID UUID

问题描述 投票:0回答:3

我正在尝试在数据库中创建具有

id
字段的表,默认情况下该字段将使用 UUID 填充 id。

我尝试过类似的事情:

CREATE TABLE FOO (
  id CHAR(36) PRIMARY KEY DEFAULT uuid()
);

非常感谢您的帮助。

mysql uuid
3个回答
52
投票

MySQL 5.7、8.0.12 及更早版本

MySQL 从 5.7 或 8.0.12 开始不支持使用函数或表达式作为列的默认值。

数据类型规范中的 DEFAULT 值子句指示列的默认值。除了一个例外,默认值必须是常量; 它不能是函数或表达式。

https://dev.mysql.com/doc/refman/5.7/en/data-type-defaults.html

另一种方法是使用触发器来监视所需表的

BEFORE INSERT

DELIMITER ;;
CREATE TRIGGER `foo_before_insert` 
BEFORE INSERT ON `foo` FOR EACH ROW 
BEGIN
  IF new.id IS NULL THEN
    SET new.id = uuid();
  END IF;
END;;
DELIMITER ;

这会将

INSERT
语句的默认值更改为
uuid()
值,除非已明确定义。


MySQL 8.0.13 及更高版本

随着 MySQL 8.0.13 的发布,现在可以将表达式用作默认值,前提是将其括在括号中。

示例

db<>小提琴

DEFAULT

子句中指定的默认值可以是文字
常数或表达式。除一处例外外,请将表达式括起来
括号内的默认值以将其与文字区分开
恒定的默认值。
例外的是,对于 
TIMESTAMP
DATETIME
 列,您可以将 
CURRENT_TIMESTAMP
 [常量] 指定为默认值,而不用括号括起来。

CREATE TABLE foo (b BINARY(16) DEFAULT (UUID_TO_BIN(UUID())));
插入新行时,可以通过省略列名称或将列指定为 

DEFAULT

(就像具有文字默认值的列一样)来插入具有表达式 default 的列的默认值:

INSERT INTO foo () VALUES(); INSERT INTO foo () VALUES(DEFAULT);

https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html


12
投票
对于 Mysql 版本 8 及以上版本,答案可以在以下位置找到:

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

CREATE TABLE t1 ( 'uuid_field' VARCHAR(32) DEFAULT (uuid());
    

1
投票
如果您使用

binary(16)

作为类型,您可以按如下方式设置默认值:

unhex(replace(uuid(),'-',''))
    
© www.soinside.com 2019 - 2024. All rights reserved.