有一个比较奇葩的需求。

在表中增加一个字段,在添加(导入与手动添加)数据的时候将添加的自增长字段赋值给另一个字段。目的是为了兼容之前的数据。

本来打算用trigger写的,只是insert之后再update不能在同一张表中,所以就放弃了,不过也算是学习了一下触发器,一会总结到下面。

根据关于将表中自增长字段赋值给另外一个字段的方法这篇文章,最终实现了需求。

为了防止原文删除,我简单的记录一下:

关键SQL:此处关键在于SQL用户具有information_schema库查询权限。

SELECT Auto_increment FROM information_schema.`TABLES` WHERE  Table_Schema= '数据库名' AND table_name = '表名'
INSERT INTO 表名(字段1,字段2)values ('aaa',
(SELECT Auto_increment FROM information_schema.`TABLES` WHERE Table_Schema= '数据库名' AND table_name = '表名'));

大概就是这样子。


最初的想法:是先查询最大的自增字段,再将这个值+1赋值给需要的字段,这样做是怕并发大了,不好处理。

第二个想法:先去添加记录,再获取自增字段,再update该条记录。

第三个想法:trigger未实现,但是粗略学习了一下。

一、语法:

delimiter $$   < 以$$开疛,再以$$结束,因为begin后面是sql语句有一个分号>

CREATE TRIGGER trigger的名称
BEFORE INSERT ON 表名称 FOR EACH ROW 
BEGIN
  set new.name = '123';
END $$

如果是insert的话,下面写法可以正常的创建,但是在真正的执行添加操作时会报错

 begin UPDATE 表名 set new.name='123' ;

[Err] 1442 - Can't update table '表名' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.)

二、查看,删除

SHOW   TRIGGERS

drop trigger trigger名称

三、trigger说明

在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;

OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器

①如果 BEFORE 触发器执行失败,SQL 无法正确执行。
②SQL 执行失败时,AFTER 型触发器不会触发。
③AFTER 类型的触发器执行失败,SQL 会回滚。