如何为仅在以“Table_”开头的表更新后触发的触发器

时间:2016-07-24 14:32:32

标签: mysqli triggers routines

我试图在某些条件条件下发出触发器 在UPDATE之后,在以特定字符串开头的表格上,例如“A_”。

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
;

触发器应使SUM(列“A”)减去SUM(列“B”)直到更新行的索引,并将此SUM写入此行中的“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行

你能帮帮我吗?

2 个答案:

答案 0 :(得分:1)

嗯,我认为你可以选择表格,然后再触发。

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

注意:请务必将<your-database-name>替换为您的数据库名称。

答案 1 :(得分:0)

触发器属于特定表。 您需要为要监视的每个表手动添加触发器(在您的情况下,每个名称以&#39; A&#39;开头的表)。

文档:CREATE TRIGGER Syntax

你的要求对我来说似乎很奇怪。仅为名称与过滤器匹配的表更新数据是非常不寻常的。您确定无法重新组织数据库结构并拥有所有&#34; A *&#34;表合并为一个表?