触发器初始结构:

DELIMITER $$

CREATE

TRIGGER `数据库名`.`触发器名` BEFORE/AFTER INSERT/UPDATE/DELETE

ON `数据库名`.`表名`

FOR EACH ROW BEGIN

-- 逻辑、条件语句

END$$

DELIMITER ;

目的:当一张表中的某个字段值更新为特定值时,触发更新本条数据的另一字段值

( 示例:根据 prj_base_info 表中的 project_status 的值判断是否是600时,触发更新同表的 complete_time 字段的时间为系统当前时间 )

开始写出的触发器如下所示

DROP TRIGGER IF EXISTS update_complete_time;

DELIMITER $

CREATE TRIGGER update_complete_time AFTER UPDATE

ON prj_base_info FOR EACH ROW

BEGIN

IF (new.project_status=600)

THEN

UPDATE prj_base_info

SET complete_time =DATE_FORMAT(NOW(), '%Y-%m-%d')

WHERE prj_base_info.id = new.id;

END IF;

END $

执行结果没有问题,创建触发器成功,但是执行 update 语句进行测试如下报错,提示:无法更新存储函数/触发器中的表 'prj_base_info',因为它已经被调用此存储函数/触发器的语句使用。

1 queries executed, 0 success, 1 errors, 0 warnings

查询:update prj_base_info set type=2,project_status=600 where id='1537842899333'

错误代码: 1442

Can't update table 'prj_base_info' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

通过查阅资料了解,同表的更新不能在触发器里使用 update,而是直接使用set

修改为:

DROP TRIGGER IF EXISTS update_complete_time;

DELIMITER $

CREATE TRIGGER update_complete_time AFTER UPDATE

ON prj_base_info FOR EACH ROW

BEGIN

IF (new.project_status=600)

THEN

SET new.complete_time =DATE_FORMAT(NOW(), '%Y-%m-%d')

;

END IF;

END $

结果发现还报错。。。

错误代码: 1362

Updating of NEW row is not allowed in after trigger

把 AFTER 修改为BEFORE即可:

DROP TRIGGER IF EXISTS update_complete_time;

DELIMITER $

CREATE TRIGGER update_complete_time BEFORE UPDATE

ON prj_base_info FOR EACH ROW

BEGIN

IF (new.project_status=600)

THEN

SET new.complete_time =DATE_FORMAT(NOW(), '%Y-%m-%d')

;

END IF;

END $

BEFORE 与 AFTER 区别:

BEFORE:( insert、update )可以对 new 进行修改,AFTER 不能对 new 进行修改,两者都不能修改 old 数据。

对于 INSERT 语句, 只有 NEW 是合法的;

对于 DELETE 语句,只有 OLD 才合法;

对于 UPDATE 语句,NEW、OLD 可以同时使用。

总结:BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。

mysql触发器对同一张表做操作_MySql 触发器对同表操作相关推荐

  1. MySQL简单表的数据_MySQL(二)表的操作与简单数据操作

    六大约束:主键约束.外键约束.非空约束.唯一约束.默认约束.自动增加 1.not null非空 2.defaul默认值,用于保证该字段的默认值 ; 比如年龄:1900-10-10 3.primar k ...

  2. MySQL优化调优有没有做过_MySQL 调优/优化的 100 个建议

    MySQL是一个强大的开源数据库.随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈.这里提供 101 条优化 MySQL 的建议.有些技巧适合特定的安装环境,但是思路是相通的.我已经将它们分成 ...

  3. mysql 吧库下的表名都加_MySQL 数据库名、表名、字段名大小写敏感记录

    问题如下: 比如上图中的PERSON表,查询SQL语句中如果表名是小写,就会报错说person表不存在. 因为Linux环境下的MySQL数据库的表名默认是区分大小写的,可以查看Linux上的MySQ ...

  4. mysql行锁还需要乐观锁吗_mysql行锁、表锁。乐观锁,悲观锁

    锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...

  5. mysql 中间表的好处_Mysql中使用中间表提高统计查询速度

    对于数据量较大的表,在其上进行统计查询通常会效率很低,并且还要考虑统计查询是否会对在线的应用产生负面影响.通常在这种情况下,使用中间表可以提高统计查询的效率, 下面通过对session 表的统计来介绍 ...

  6. excel 表做下拉框_Excel工作表的组合框下拉列表

    excel 表做下拉框 Would you prefer a bigger font size for items in a data validation drop down list? Would ...

  7. 怎么修改mysql表的结构_MySQL数据库如何修改表结构

    MySQL数据库修改表结构的方法:1.使用add添加字段,使用drop删除字段:2.使用alter修改字段名:3.修改列类型:4.修改表名:5.修改表选项:6.修改列属性. [相关图文教程:mysql ...

  8. mysql建库建表的语句_mysql建库建表语句

    1.mysql管理数据库 1.1 创建数据库 创建数据库:CREATE DATABASE 数据库名; 显示数据库名: show database; 1.2删除数据库 删除数据库:drop databa ...

  9. mysql插入另一个表中数据_MySql中把一个表的数据插入到另一个表中的实现

    1.如果2张表的字段一致,并且希望插入全部数据,可以用这种方法: INSERT INTO 目标表 SELECT * FROM 来源表; insert into insertTest select * ...

  10. mysql删除表编码字段_mysql 修改 添加 删除 表字段

    mysql 修改 添加 删除 表字段 添加表的字段 alter table 表名 add 字段名 字段的类型 例子: alter table table1 add transactor varchar ...

最新文章

  1. RDKit | 基于RF和SVM的溶解度预测模型比较
  2. php 图片预览原理,JavaScript_纯JS实现的批量图片预览加载功能,1.实现原理直接见代码,需要一 - phpStudy...
  3. 马斯克的火箭,这次没!爆!炸!
  4. Gnu/Linux 链接XServer方法
  5. mysql 中文含数字排序_英语| 124期 Sort 坑爹的字符串排序
  6. 「Python」unindent does not match any outer indentation level
  7. mybatis使用in语句作为查询条件
  8. ROS入门 Client Library与roscpp
  9. 【转】惹恼程序员的十件事
  10. 【spring】注解开发和spring整合junit
  11. 计算机机房维护与管理,计算机机房的管理与维护.doc
  12. php项目推荐,php教程推荐:最值得推荐的10个php教程
  13. java web 项目分模块,javaweb项目模块划分
  14. 主力用计算机吸筹,通达信主力吸筹指标
  15. 感冒究竟能不能喝咖啡
  16. 怎么给图片加边框线?图片加边框的方法
  17. cs服务器(cs索沛服务器)
  18. (基础篇1-15)项目架构简介及环境搭建
  19. 动手深度学习v2 汇聚层pooling 课后习题
  20. ebcdic java_在Java中将EBCDIC转换为ASCII

热门文章

  1. c语言程序中的注释必须单独占一行,C语言习题第一章
  2. extract进程 oracle,ogg extract进程stoped问题
  3. java中集合的区别_Java中的集合与集合之间的区别
  4. 添加域名不生效_域名注册+域名解析、备案方法
  5. linux查看无线网卡频率,查看无线网卡工作模式
  6. python对话机器人软件_如何用Python为聊天机器人创建对话?
  7. 查看MySQL句柄_mysql查询语句-handler
  8. python函数的高级用法
  9. test index.php,index.php
  10. 24有几种封装尺寸_Y6T16 光模块尺寸演进