Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 仅当另一个表上的列被更新或新记录被添加到另一个表时,才将记录插入新的MySQL数据库表?_Php_Mysql_Sql - Fatal编程技术网

Php 仅当另一个表上的列被更新或新记录被添加到另一个表时,才将记录插入新的MySQL数据库表?

Php 仅当另一个表上的列被更新或新记录被添加到另一个表时,才将记录插入新的MySQL数据库表?,php,mysql,sql,Php,Mysql,Sql,我有下面的MySQL SQL,它在我每次保存项目任务时构建的项目管理应用程序上运行 保存可以包括保存新任务记录以及更新现有记录。出于这个原因,我在下面有一个奇特的SQL,它插入一个新的任务记录,如果一个任务记录还没有使用该ID,如果它已经存在,那么它会更新某些字段。它非常聪明,除非名称、描述、状态、类型和优先级字段已从以前的值更改,否则它不会更新date_modified列。原因是,每次记录更新时,“排序顺序”列都会更改,但如果仅更新“排序顺序”列,则不应构成“修改日期”字段的更改 它以这种方式

我有下面的MySQL SQL,它在我每次保存项目任务时构建的项目管理应用程序上运行

保存可以包括保存新任务记录以及更新现有记录。出于这个原因,我在下面有一个奇特的SQL,它插入一个新的任务记录,如果一个任务记录还没有使用该ID,如果它已经存在,那么它会更新某些字段。它非常聪明,除非名称、描述、状态、类型和优先级字段已从以前的值更改,否则它不会更新date_modified列。原因是,每次记录更新时,“排序顺序”列都会更改,但如果仅更新“排序顺序”列,则不应构成“修改日期”字段的更改

它以这种方式工作的原因是,页面上有一个表单可以加载项目的所有任务记录,因此您可以一次性批量编辑所有记录,也可以在底部添加新的任务记录。因此,下面的SQL将在WHILE循环中为保存的每个任务记录调用

到目前为止,它工作得很好,正如我所希望的,但现在我面临着另一个挑战

我想为更新创建一个新的数据库表,它基本上会在每次添加新任务记录和每次更新任务记录时插入新记录

例如,当我用20个项目任务更新一个页面,并更改其中5个任务记录上的值时,它会将5个新记录插入我的更新表中。类似于

JasonDavis更新任务记录1 JasonDavis更新任务记录2 JasonDavis更新任务记录3 JasonDavis更新任务记录4 JasonDavis更新任务记录5 JasonDavis增加了新的任务记录4534

按照下面SQL的运行方式,我无法在PHP中知道哪些记录被实际更新,因为它更新了每一条记录,我需要在我的新表中插入只更新了修改日期的记录

问题1:有人知道我如何实现这个目标吗?修改下面的SQL或其他方法,以确保在创建新任务记录时,或在任务记录更新了以下任何列(名称、说明、状态、类型、优先级或更新日期)时,将新记录插入更新数据库表。这意味着,如果任务记录仅更新排序顺序之类的字段,则不会将新记录插入更新后的任务记录的更新表中

我在StackOverflow上看到过一些帖子,它们使用触发器执行一些类似的操作,但仍然远没有那么复杂的项目,直到最近我才使用过触发器,甚至没有听说过它们,所以我不知道我是否必须这样做,如果是这样,我将如何让它在我的新更新表中执行如此复杂的条件插入

我的最终目标是简单地创建一个新的UPDATES表,它将充当一个流,显示创建和修改的任务以及事件发生的用户和日期时间。使它复杂化的是,我下面现有的INSERT或UPDATE SQL现在必须继续工作,但不知何故要获得正确的任务,这些任务会根据上述条件进行更新,从而在新的UPDATES表中构成新的INSERT记录。请帮助专家


我开始试验触发器,它们似乎是我的票,它们正在工作,正在实现我的最终目标

对于任务插入,我有这个触发器

对于任务更新,我有一个触发器…它只在修改日期字段时创建更新流记录

DROP TRIGGER IF EXISTS project_task_updates_stream;
DELIMITER $$
CREATE TRIGGER `project_task_updates_stream` AFTER UPDATE ON `apoll_web_projects_tasks` FOR EACH ROW
BEGIN
IF NOT (NEW.date_modified <=> OLD.date_modified)
    THEN
        INSERT INTO apoll_web_projects_updates_stream (event_type, record_id, modified_user_id, record_name, description, date_entered) VALUES ('0', NEW.task_id, NEW.modified_user_id, NEW.name, NEW.description, NEW.date_modified);
    END IF;
END $$
DELIMITER ;
DROP TRIGGER IF EXISTS project_task_new_stream;
CREATE TRIGGER `project_task_new_stream` AFTER INSERT ON `apoll_web_projects_tasks`
FOR EACH ROW
    INSERT INTO apoll_web_projects_updates_stream (event_type, record_id, modified_user_id, record_name, description, date_entered) VALUES ('0', NEW.task_id, NEW.modified_user_id, NEW.name, NEW.description, NEW.date_modified);
DROP TRIGGER IF EXISTS project_task_updates_stream;
DELIMITER $$
CREATE TRIGGER `project_task_updates_stream` AFTER UPDATE ON `apoll_web_projects_tasks` FOR EACH ROW
BEGIN
IF NOT (NEW.date_modified <=> OLD.date_modified)
    THEN
        INSERT INTO apoll_web_projects_updates_stream (event_type, record_id, modified_user_id, record_name, description, date_entered) VALUES ('0', NEW.task_id, NEW.modified_user_id, NEW.name, NEW.description, NEW.date_modified);
    END IF;
END $$
DELIMITER ;