Php MySQL触发器是否根据SQL查询中更改的字段创建多个记录?
我有一个MySQL触发器,当任务记录被修改时,它会在另一个DB表中创建一个“任务事件日志”记录 触发器创建的事件记录只能与“任务已编辑”一样具体,现在我需要更高级的东西 我需要为修改的每个任务字段创建单独的事件日志记录 如果任务标题、描述和截止日期都更改了,我需要做3个事件记录,每个字段修改1个。“任务到期日已修改” 是否有方法为每个使用触发器“修改”的任务字段创建单独的事件表记录 使用触发器的主要原因是我有一个批量更新任务页面,允许批量更新所有任务记录和所有字段值。它还允许拖放更改排序顺序,当记录上的sot顺序发生更改时,除非实际任务字段也发生更改,否则不会更改taks修改日期Php MySQL触发器是否根据SQL查询中更改的字段创建多个记录?,php,mysql,triggers,Php,Mysql,Triggers,我有一个MySQL触发器,当任务记录被修改时,它会在另一个DB表中创建一个“任务事件日志”记录 触发器创建的事件记录只能与“任务已编辑”一样具体,现在我需要更高级的东西 我需要为修改的每个任务字段创建单独的事件日志记录 如果任务标题、描述和截止日期都更改了,我需要做3个事件记录,每个字段修改1个。“任务到期日已修改” 是否有方法为每个使用触发器“修改”的任务字段创建单独的事件表记录 使用触发器的主要原因是我有一个批量更新任务页面,允许批量更新所有任务记录和所有字段值。它还允许拖放更改排序顺序,当
BEGIN
IF NOT (NEW.date_modified <=> OLD.date_modified)
THEN
INSERT INTO apoll_web_projects_events (event_type, project_id, task_id, created_by_user_id, description, date_created) VALUES ('7', NEW.project_id, NEW.task_id, NEW.modified_user_id, NEW.name, UTC_TIMESTAMP());
END IF;
END
开始
如果没有(NEW.date\u modified OLD.date\u modified)
然后
将值('7',NEW.project_id,NEW.task_id,NEW.modified_user_id,NEW.name,UTC_TIMESTAMP())插入apoll_web_projects_events(事件类型,项目id,任务id,由用户创建,描述,创建日期)中;
如果结束;
结束
下面是我的MySQL查询,它批量更新任务记录,确保在满足更改的字段条件时只更新修改的日期字段
然后,触发器仅对符合条件的记录触发,并更新date_modified字段
INSERT INTO
$this->tasksDbTableName(task_id, project_id, created_by_user_id, modified_user_id, name, description, status, priority, type, date_entered, date_modified, date_started, date_completed, date_due, milestone_id, assigned_user_id, sort_order, heading)
VALUES
($db->quote($taskId), '$projectId', '$created_by_user_id', '$modified_user_id', '$name', '$description', '$status', '$priority', '$type', UTC_TIMESTAMP(), UTC_TIMESTAMP(), '$date_started', '$date_completed', '$date_due', '$milestone_id', '$assigned_user_id', '$sort_order', '$heading')
ON DUPLICATE KEY UPDATE
date_modified = (CASE
WHEN name <> values(name)
OR description <> values(description)
OR status <> values(status)
OR type <> values(type)
OR priority <> values(priority)
THEN UTC_TIMESTAMP()
ELSE date_modified
END),
modified_user_id='$modified_user_id',
name='$name',
description='$description',
status='$status',
priority='$priority',
type='$type',
date_started='$date_started',
date_completed='$date_completed',
date_due='$date_due',
milestone_id='$milestone_id',
assigned_user_id='$assigned_user_id',
sort_order='$sort_order',
heading='$heading'
插入到
$this->tasksDbTableName(任务id、项目id、由用户id创建、修改用户id、名称、描述、状态、优先级、类型、输入日期、修改日期、开始日期、完成日期、到期日期、里程碑id、分配用户id、排序顺序、标题)
价值观
($db->quote($taskId)、“$projectId”、“$created_by_user_id”、“$modified_user_id”、“$name”、“$description”、“$status”、“$priority”、“$type”、UTC_TIMESTAMP()、UTC_TIMESTAMP()、“$date_start”、“$date_completed”、“$date due”、“$里程碑_id”、“$assigned_user_id”、“$assigned"分配的"排序"、$heading”)
关于重复密钥更新
修改日期=(案例)
当使用名称值(名称)时
或描述值(描述)
或状态值(状态)
或类型值(类型)
或优先级值(优先级)
然后UTC_时间戳()
其他日期(已修改)
(完),,
modified_user_id=“$modified_user_id”,
name=“$name”,
description=“$description”,
状态=“$status”,
优先级=“$priority”,
类型=“$type”,
date_started=“$date_started”,
完成日期=“$date\u completed”,
到期日期=“$date\u due”,
里程碑号=“$milestone号”,
assigned_user_id=“$assigned_user_id”,
排序顺序=“$sort\u order”,
标题=“$heading”
在上面的SQL中,当满足条件使其继续并更新任务记录时,是否有办法让它也触发某种事件,为正在更新的每个字段创建一个事件记录?为什么不能在同一触发器中添加另一个插入项?@Marki555可能可以,我不确定?我的意思是,在触发器中,我需要知道6个任务记录字段中的哪些字段已经更改,并且只为更改的字段创建一个新记录。因此,如果对1条记录更改了
截止日期
,它将为截止日期更改创建一个事件记录,但不会为另一个可能需要创建标题更改事件记录的任务创建事件记录。AFAIK触发器将针对每个更改的行执行。。。在它里面,你可以检查哪些字段被实际更改,并为所有被更改的字段进行插入change@Marki555这听起来正是我所需要的,但我还没有找到一种方法来做到这一点,也不知道这是可能的