没有主键的MySQL插入触发器

时间:2019-06-26 11:50:11

标签: mysql triggers insert

我正在尝试创建一个触发器,如果​​该字段未在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作为主键。

2 个答案:

答案 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的上述有关数据库性能和设计的评论。好东西。