【问题标题】:SQL Trigger @@ROWCOUNTSQL 触发器@@ROWCOUNT
【发布时间】:2012-05-30 07:44:07
【问题描述】:

我应该为更新创建一个 sql 触发器,它只会在受影响的行大于 0 时激活。然而,即使受影响的行是 0(或者新记录与旧记录相同),它仍然会触发扳机。在执行下面的插入查询之前,我想检查受影响的行数。提前致谢!对不起我的语法!

DELIMITER $$

DROP TRIGGER /*!50032 IF EXISTS */ `dbase`.`table_update_trigger`$$

CREATE
    /*!50017 DEFINER = 'root'@'localhost' */
    TRIGGER `table_update_trigger` AFTER UPDATE ON `table` 
    FOR EACH ROW BEGIN

IF (@@ROWCOUNT > 0) THEN
INSERT INTO 
    table_audit_trail
    (column1,
    column2,
    column3,
    column4,
    column5,
    column100) 
VALUES
    (old.column1,
    old.column2,
    old.column3,
    old.column4,
    old.column5,
    old.column100);
END IF;
END;

【问题讨论】:

  • “不顺利”是什么意思?请编辑问题以准确说明会发生什么以及您希望发生什么。
  • 我对 MySQL 不太了解,但我认为定义为 FOR EACH ROW 的触发器只会触发......如果有受影响的行。如果没有受影响的行,此触发器会触发多少次?
  • 我读了你的问题,但遗憾的是它并不顺利。请在这件事上给予我帮助! (通过提供错误消息、记录预期和意外行为等。我们不是通灵者,抱歉。)
  • 对不起我的语法,我修改了我的问题以更准确地说明我想要发生的事情。谢谢!

标签: php mysql sql triggers


【解决方案1】:

MySQL 中没有@@ROWCOUNT。 您可以阅读this post 了解如何替换它。

但你不需要那个。您的触发器是for each row,因此它将为每个更新的行触发。 (但这并不意味着您的行已更改。只是它们已被某些语句更新。)

【讨论】:

  • 哦,我明白了,但是如果我不知道执行的查询怎么办?但我想知道是否有更改。
  • 比较oldnew之间的每一列
  • 嗯,这是我的第一选择,但我有 400 列要比较。有没有其他方法可以检查是否有变化?谢谢!
  • 阅读this post
  • 我尝试添加列 ts,输入时间戳而不是 null,但是,每当我更新记录时,此列都不会改变。我在执行我的查询时使用 SQLyog Enterprise。
猜你喜欢
  • 2011-10-23
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 2011-08-06
  • 1970-01-01
相关资源
最近更新 更多