Mysql 如何使触发器仅在更新后为以“Table\”开头的表触发

Mysql 如何使触发器仅在更新后为以“Table\”开头的表触发,mysql,triggers,routines,Mysql,Triggers,Routines,我正试图制造一个在特定条件下开火的触发器 更新后,在以特定字符串(例如a_u)开头的表上 CREATE TABLE `Table_TEST` ( `id` INT(11) NULL DEFAULT NULL, `A` INT(11) NULL DEFAULT NULL, `B` INT(11) NULL DEFAULT NULL, `C` INT(11) NULL DEFAULT NULL ) COLLATE='utf8_unicode_ci' ENGINE=In

我正试图制造一个在特定条件下开火的触发器 更新后,在以特定字符串(例如a_u)开头的表上

CREATE TABLE `Table_TEST` (
    `id` INT(11) NULL DEFAULT NULL,
    `A` INT(11) NULL DEFAULT NULL,
    `B` INT(11) NULL DEFAULT NULL,
    `C` INT(11) NULL DEFAULT NULL
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
;
触发器应使求和列A减去求和列B,直到更新行的索引为止,并将此求和写入此行的C列

CREATE DEFINER=`root`@`localhost` 
TRIGGER `Table_TEST_before_insert` BEFORE UPDATE ON `Table_TEST` FOR EACH ROW
BEGIN
SET new.C = (SUM(new.A)-SUM(new.B));
END
此触发器不工作并导致此故障

UPDATE `Testdb`.`Table_TEST` SET `b`='4' WHERE  `id`=1 LIMIT 1;
/* SQL Fehler (1111): Invalid use of group function */
在此之后,它应根据给定公式更新该索引之后C列中的所有其他值,直到相应的索引

现在,我用php编写了一个函数,在每次更新php脚本中的数据库后都会附加该函数。但事实上这不是我想要的

我希望这是一个常规/触发器

我所尝试的看起来像这样,但请注意它不起作用

CREATE DEFINER=`root`@`localhost`
TRIGGER `TABLE_1_before_update` BEFORE UPDATE ON `TABLE_1` FOR EACH ROW
BEGIN
SET new.C = (SUM(new.A)-SUM(new.B)) WHERE id=NEW.id;
END
我遇到的失败是: SQL Fehler 1064:您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以了解在“WHERE id=NEW.id”附近使用的正确语法; 在第2行结束


你能帮我一下吗?

触发器属于特定的表。 您需要手动将触发器添加到案例中要监视的每个表中,每个表的名称以“a”开头

文件:


我觉得你的要求很奇怪。仅为名称与筛选器匹配的表更新数据是非常罕见的。您确定不能重新组织数据库结构并将所有A*表的数据合并到一个表中吗?

嗯,我认为您可以选择这些表,然后执行触发器

SELECT `TABLE_NAME`
  FROM information_schema.tables
 WHERE table_schema='<your-database-name>'
   AND `TABLE_NAME` LIKE 'a%'
编辑:

没有测试,但如果没有,也可以使用,只需选择前面查询的表名,然后像我前面所说的那样创建每个触发器

CREATE 
DEFINER=`user`@`localhost`
TRIGGER `trigger_name` AFTER UPDATE
ON (
    SELECT `TABLE_NAME` 
      FROM information_schema.tables 
    WHERE table_schema='<your-database-name>'
      AND `TABLE_NAME` LIKE 'a%'
)  FOR EACH ROW 

BEGIN
    SET new.C = (SUM(new.A)-SUM(new.B)) WHERE id=NEW.id;
END

注意:请确保替换数据库名称。

谢谢您的评论。我选择此选项有很多性能原因。好的,我知道了,然后让我们谈谈问题的第二部分。SQL故障1362:在触发后不允许更新新行。然后我将其改为更新前:SQL Fehler 1064:您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以了解在“WHERE id=NEW.id”附近使用的正确语法;在2号线结束*/井。。。正如我在发布后所说,我不确定后更新,但前更新应该可以工作。正如您在错误消息中看到的,这是您添加的部件的语法错误。如果希望我和其他人检查并提供帮助,请检查语法或发布代码。错误消息在第2行显示您的WHERE,在代码中,WHERE在第5行显示。是否有相同的代码例外?