如何仅针对以 "Table_" 开头的表制作在更新后触发的触发器
How to make a trigger that fires after update only for tables that begin with a "Table_"
我正在尝试制作一个在特定条件下触发的触发器
在 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 脚本中的数据库中每次更新后附加该函数。但其实不是我想要的
我想要这个 Routine/Trigger。
我试过的看起来像这样,但请注意它不起作用
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 行结束'
你能帮帮我吗?
触发器属于特定 table。
您需要为每个要监视的 table 手动添加触发器(在您的情况下,每个 table 的名称以 'A' 开头)。
我觉得你的要求很奇怪。仅更新名称与过滤器匹配的 table 的数据是很不寻常的。您确定不能重组您的数据库结构并将所有 "A*" table 的数据合并到一个 table 中吗?
好吧,我想你可以 select table 然后你触发。
SELECT `TABLE_NAME`
FROM information_schema.tables
WHERE table_schema='<your-database-name>'
AND `TABLE_NAME` LIKE 'a%'
编辑:
未测试,但这也可以工作(如果不行,只需 select 上一个查询的 table 名称,然后按照我之前所说的创建每个触发器)。
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>
替换为您的数据库名称。
我正在尝试制作一个在特定条件下触发的触发器 在 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 脚本中的数据库中每次更新后附加该函数。但其实不是我想要的
我想要这个 Routine/Trigger。
我试过的看起来像这样,但请注意它不起作用
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 行结束'
你能帮帮我吗?
触发器属于特定 table。 您需要为每个要监视的 table 手动添加触发器(在您的情况下,每个 table 的名称以 'A' 开头)。
我觉得你的要求很奇怪。仅更新名称与过滤器匹配的 table 的数据是很不寻常的。您确定不能重组您的数据库结构并将所有 "A*" table 的数据合并到一个 table 中吗?
好吧,我想你可以 select table 然后你触发。
SELECT `TABLE_NAME`
FROM information_schema.tables
WHERE table_schema='<your-database-name>'
AND `TABLE_NAME` LIKE 'a%'
编辑:
未测试,但这也可以工作(如果不行,只需 select 上一个查询的 table 名称,然后按照我之前所说的创建每个触发器)。
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>
替换为您的数据库名称。