我已经在 Stackoverflow 上提出了我的问题,但还没有真正得到任何答案,所以我现在在这里尝试。
我有在下面的 PHP 脚本中运行的 MySQL 查询。
它的作用是插入一个新的项目任务记录,如果不存在具有该 ID 号的记录。
如果存在带有 ID 号的记录,则它会更新它应该更新的字段。
我遇到的问题是我需要它仅在date_modified
这些列之一的值更改时更新列... name
、、、、或description
status
type
priority
public function addOrUpdateTaskRecord($taskId, $projectId, $name, $description, $status, $priority, $type, $date_entered, $date_modified, $sort_order, $heading){
$sql = "
INSERT INTO
$this->tasksDbTableName(task_id, project_id, name, description, status, priority, type, date_entered, date_modified, sort_order, heading)
VALUES
('$taskId', '$projectId', '$name', '$description', '$status', '$priority', '$type', UTC_TIMESTAMP(), UTC_TIMESTAMP(), '$sort_order', '$heading')
ON DUPLICATE KEY UPDATE
name='$name',
description='$description',
status='$status',
priority='$priority',
type='$type',
date_modified=UTC_TIMESTAMP(),
sort_order='$sort_order',
heading='$heading'";
return $this->db->query($sql);
}
这里的另一位用户 Gordon Linoff 向我展示了我可能能够改变它date_modified=UTC_TIMESTAMP(),
并在适当的位置使用它......
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)
这看起来很有希望,并且在 MySQL 中没有产生任何错误。它仍然在需要时插入新记录,并在它是现有记录时更新,但现在它总是更新该date_modified
字段,即使我的 CASE 语句中的其他字段没有更改。
我真的可以使用一些帮助来获得这样的高级功能或替代方法吗?
那里的数据库专家有什么帮助吗?
我的最新代码....
public function addOrUpdateTaskRecord($taskId, $projectId, $name, $description, $status, $priority, $type, $date_entered, $date_modified, $sort_order, $heading){
$sql = "
INSERT INTO
$this->tasksDbTableName(task_id, project_id, name, description, status, priority, type, date_entered, date_modified, sort_order, heading)
VALUES
('$taskId', '$projectId', '$name', '$description', '$status', '$priority', '$type', UTC_TIMESTAMP(), UTC_TIMESTAMP(), '$sort_order', '$heading')
ON DUPLICATE KEY UPDATE
name='$name',
description='$description',
status='$status',
priority='$priority',
type='$type',
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),
sort_order='$sort_order',
heading='$heading'";
return $this->db->query($sql);
}
我的数据库表看起来像这样......
CREATE TABLE IF NOT EXISTS apoll_web_projects_tasks (
task_id bigint(20) NOT NULL default '0',
project_id varchar(70) NOT NULL default '0',
name varchar(255) NOT NULL,
description varchar(36) default NULL,
status varchar(20) DEFAULT NULL,
priority varchar(20) DEFAULT NULL,
type varchar(20) DEFAULT NULL,
date_entered datetime DEFAULT NULL,
date_modified datetime DEFAULT NULL,
sort_order int(12) DEFAULT NULL,
heading int(2) NOT NULL default '0',
PRIMARY KEY (task_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;