我正在尝试在数据库中创建具有
id
字段的表,默认情况下该字段将使用 UUID 填充 id。
我尝试过类似的事情:
CREATE TABLE FOO (
id CHAR(36) PRIMARY KEY DEFAULT uuid()
);
非常感谢您的帮助。
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 的发布,现在可以将表达式用作默认值,前提是将其括在括号中。
示例
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
binary(16)
作为类型,您可以按如下方式设置默认值:
unhex(replace(uuid(),'-',''))