有一个比较奇葩的需求。
在表中增加一个字段,在添加(导入与手动添加)数据的时候将添加的自增长字段赋值给另一个字段。目的是为了兼容之前的数据。
本来打算用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 会回滚。