正确仔细地设置 MySQL 触发器语法

Setting up MySQL trigger syntax correctly and carefully

我一直在学习很多关于 MySQL 和触发器的新知识。我 认为 我理解这个概念,我意识到使用它们有很多可能的危险。但是我相信对它们的有限使用对于我想要执行的功能是正确的。

我有 9 个 table 对应于 9 个不同的基于 Web 的 Ajax 引擎表单。我在这些方面努力工作,这是我第一次使用 Ajax,我对它们相当满意。每次用户对他们正在填写的表单进行更改时,更改都会 Ajax 返回到数据库,他们会得到确认或错误响应。非常坦率的。每个表单各自的 table 都有一个 "status" 字段,一个 "lastModified" 字段和一个我称之为 "agRef" 的字段,它有点像状态,但在表单到达某个阶段之前为空, 进一步沿着这个过程。

我还有一个名为 "records" 的附加 table,其中列出了任何其他 table 中的所有条目,因此我们可以轻松查看已启动的表单,他们最后一次更改的时间以及他们的状态。所以这里是我认为触发器部分应该起作用的地方,这样我就不必在我的 php 中对 "records" table 进行更新。

]

"records"table是这样设置的:

`uaID` int(11) NOT NULL AUTO_INCREMENT,
`uID` int(11) NOT NULL,
`appNo` int(11) NOT NULL,
`applicationKey` varchar(8) NOT NULL,
`appID` int(11) DEFAULT NULL,
`applicationName` varchar(64) NOT NULL,
`agRef` varchar(32) DEFAULT NULL,
`status` varchar(32) NOT NULL,
`dateStarted` int(11) NOT NULL,
`lastModified` int(11) NOT NULL,

现在,所有这些字段都被同时填充,匹配的条目被插入到表单连接的其他 9 个 table 中的任何一个。其他 9 个 table 之一的一个小例子如下所示:

`appID` int(11) NOT NULL AUTO_INCREMENT,
`uID` int(11) NOT NULL,
`uaID` int(11) NOT NULL,
`status` varchar(32) NOT NULL DEFAULT 'Data Acquisition',
`agRef` varchar(32) DEFAULT NULL,
`groupName` varchar(64) DEFAULT NULL,
`shortTitle` varchar(64) DEFAULT NULL,
`recipient` varchar(64) DEFAULT NULL,
`partOfValCh` varchar(64) DEFAULT NULL,
`sector` varchar(64) DEFAULT NULL,
`subSector` varchar(64) DEFAULT NULL,
`topic` varchar(64) DEFAULT NULL,
   <snip because this can go on for a lot of lines>
`dateStarted` int(11) NOT NULL,
`lastModified` int(11) NOT NULL,

两个 table 上的 agRef 暂时保持为空,appID 在记录上为空 table 最初是在创建时,但一旦相应条目进入第二个 table,它由自动递增生成,然后调用回我的记录 table 以在其中插入 appID。

从任何数据 table 中改变的三件事是三个字段 "status"、"agRef"、"lastModified".

所以我正在尝试创建一个触发器,它将在每次 alteration/update 数据 table 之后执行此操作,以便我的记录 table 中的数据是一致且准确的.

这是我第一次尝试设置触发器:

DELIMITER $$
CREATE TRIGGER `dataTableOne_to_records_sync` AFTER UPDATE ON `dataTableOne`
FOR EACH ROW BEGIN
UPDATE records (agRef, status, lastModified) VALUES (NEW.agRef, NEW.status, NEW.lastModified) WHERE appID = OLD.appID;
END$$
DELIMITER ;

我正在尝试通过 phpmyadmin 进行设置,但它返回一个错误,告诉我我的 UPDATE 行中存在语法问题。我觉得这是 WHERE 部分的问题 - appID 是将 "records" 中的行与 "dataTableOne" 中的 updated/changed 行联系起来的一个公共元素。如何正确设置?我的错误是否更严重,我是否 运行 有造成巨大混乱的风险,就像一个永无止境的循环?我第一次做这个有点偏执。在此先感谢您的帮助和建议。

UPDATE 我现在尝试了一些其他的触发器尝试,但是尽管 MySQL 会接受它们作为有效的触发器语法,但它们似乎总是会破坏整个数据库功能.任何人都可以帮助我使用触发器语法使其正常工作吗?在上面的演示 tables 中,如果第二个 table 得到更新,我希望触发器将这三个字段复制到第一个 table 中。我想要复制的三个值是 "status"、"agRef" 和 "lastModified".

我最近一次失败的尝试是这样的:

CREATE TRIGGER AIGltInq_sync AFTER INSERT ON app_AIGltInq
FOR EACH ROW
UPDATE records r
SET r.agRef        = NEW.agRef
  , r.status       = NEW.status
  , r.lastModified = NEW.lastModified
WHERE uaID = NEW.uaID;

我一点都不熟悉 UPDATE 语句的那种形式。

要更改行中列的值,我们通常会编写如下 UPDATE 语句:

 UPDATE records r
    SET r.agRef        = NEW.agRef
      , r.status       = NEW.status
      , r.lastModified = NEW.lastModified
  WHERE r.appId        = OLD.appID

参考:https://dev.mysql.com/doc/refman/5.5/en/update.html

问题已撤回。最好避免使用触发器,因为它们往往会造成比修复更多的破损!大多数建议倾向于使用您用来与数据库对话的任何脚本语言来处理该功能。在我的例子中,这是 PHP 并且 PHP 现在正在执行我希望通过使用触发器来快捷方式的所有功能。课?想要做好工作时不要走捷径。 :)