Eu fiz minha pergunta no Stackoverflow, mas realmente não obtive nenhuma resposta, então estou tentando aqui agora.
Eu tenho a consulta MySQL que é executada em um script PHP abaixo.
O que ele faz é inserir um novo registro de tarefa do projeto se não existir um com esse número de ID.
Se existir um registro com o número do ID, ele ATUALIZA os campos que deve atualizar.
O problema que tenho é que preciso atualizar a date_modified
coluna apenas quando o valor de uma dessas colunas mudar... name
, description
, status
, type
oupriority
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);
}
Outro usuário aqui, Gordon Linoff, me mostrou que eu poderia mudar isso date_modified=UTC_TIMESTAMP(),
e usar isso no lugar...
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)
Isso parecia realmente promissor e não produz erros no MySQL. Ele ainda insere um novo registro quando necessário e atualiza quando é um registro existente, mas agora sempre atualiza o date_modified
campo mesmo quando outros campos não foram alterados em minha instrução CASE.
Eu realmente preciso de alguma ajuda para fazer essa funcionalidade avançada funcionar ou um método alternativo?
Alguma ajuda dos especialistas em banco de dados por aí?
Meu código mais recente....
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);
}
Minha tabela de banco de dados está assim...
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;