我正在尝试创建一个触发器,如果该字段未在insert语句中声明,则会创建一个主键。 EG:
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作为主键。
答案 0 :(得分:1)
以前,NEW.pk
不为null,因此没有得到UUID
的结果。如果按照说明运行insert
,而未指定pk
的值,则它有一个default
,这会导致重复问题。运行
show create table mytable;
了解更多信息。
编辑:
此外,您也可以只使用auto_increment来代替触发器。
答案 1 :(得分:0)
我意识到,由于主键是varchar,所以它显然不能为null(令人困惑的MySQL Workbench允许在“ alter table”中设置此项,然后立即还原为”。这就是问题的原因。) 因此,应在“ if”块中对“”进行检查。 我已如下更改触发器,并按预期插入了
CREATE DEFINER=`root`@`%` TRIGGER `mydb`.`mytable_BEFORE_INSERT` BEFORE INSERT ON `mytable` FOR EACH ROW
BEGIN
if NEW.pk ='' then
SET NEW.pk = UUID();
end if;
set new.created_at=now();
END
其他评论: 作为讨论点,应阅读Raymond Nijland的上述有关数据库性能和设计的评论。好东西。