【发布时间】:2019-06-26 11:50:11
【问题描述】:
如果插入语句中未说明该字段,我正在尝试创建一个创建主键的触发器。 例如:
insert into mydb.mytable (nonprimarykeyfield) values ('test');
触发器是
CREATE DEFINER=`root`@`%` TRIGGER `mydb`.`mytable_BEFORE_INSERT`
BEFORE INSERT ON `mytable`
FOR EACH ROW
BEGIN
if NEW.pk is null then
SET NEW.pk = UUID();
end if;
set new.created_at=now();
END
插入失败
Error Code: 1062. Duplicate entry '' for key 'PRIMARY'
但是没有以null为主键的行。
【问题讨论】:
-
你有充分的理由使用
UUID()进行PK吗? -
UUID - 想要安全的唯一标识符
-
“UUID - 想要安全的唯一标识符”->
PRIMARY KEY AUTO_INCREMENT是 MySQL 中唯一有保证的唯一标识符。UUID()仍然可以非常非常重复小机会.. 除了使用UUID()作为 PK 时,您更“不对齐”您的 Btree 结构,因为UUID()更随机意味着选择速度更快,而不是PRIMARY KEY AUTO_INCREMENT.. 也因为 InnoDB 将主键的副本存储在二级索引您的二级索引将变得比PRIMARY KEY AUTO_INCREMENT大得多... -
@Raymond Nijland - 这是很有价值的建议
-
“UUID - 想要安全的唯一标识符” 如果您不想将
PRIMARY KEY AUTO_INCREMENT暴露给外界,这可能是很容易理解的,因为其他人可能知道您在一年中所做的客户/订单的数量作为一个有效的例子。您可以选择添加索引的UUID()列(可能生成为Generated Column)来选择..:另外请确保除此之外还有一个PRIMARY KEY AUTO_INCREMENT,因为这在 InnoDB 引擎中非常重要..