如何仅在更新后触发以“Table_”开头的表的触发器
Posted
技术标签:
【中文标题】如何仅在更新后触发以“Table_”开头的表的触发器【英文标题】:How to make a trigger that fires after update only for tables that begin with a "Table_" 【发布时间】:2016-11-27 22:26:10 【问题描述】:我正在尝试制作在特定条件下触发的触发器 在 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; 附近使用的正确语法; END'在第 2 行
你能帮帮我吗?
【问题讨论】:
【参考方案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>
替换为您的数据库名称。
【讨论】:
SQL 失败 1362:触发器后不允许更新新行 然后我把它转到更新前。 : SQL Fehler (1064): 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'WHERE id=NEW.id; 附近使用的正确语法; END' 在第 2 行 */ 嗯...我不确定更新后(正如我在发布时所说),但更新前应该可以工作。正如您在错误消息中看到的,这是您添加的部分的语法错误。如果您希望我(和其他人)检查并提供帮助,请检查您的语法或发布您的代码。 错误信息说你的 WHERE 在第 2 行,而在代码中 WHERE 在第 5 行。执行的代码是一样的吗?【参考方案2】:触发器属于特定表。 您需要手动将触发器添加到要监控的每个表(在您的情况下,每个名称以“A”开头的表)。
文档:CREATE TRIGGER Syntax
您的要求对我来说似乎很奇怪。只为名称与过滤器匹配的表更新数据是很不寻常的。您确定不能重新组织数据库结构并将所有“A*”表的数据合并到一个表中吗?
【讨论】:
感谢您的评论。我选择这个有性能原因。好的,我明白了,那我们来谈谈问题的第二部分。以上是关于如何仅在更新后触发以“Table_”开头的表的触发器的主要内容,如果未能解决你的问题,请参考以下文章