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;
Abaixo está minha solução de trabalho final. Acontece que mover isso...
para o topo da lista, acima destes campos...
Então a solução final fica assim abaixo...
Apenas movendo meu
CASE Statement
para o topo acima dos outros campos definidos, ele começou a funcionar corretamente!Quase parece que esses campos de coluna do banco de dados
name
description
status
priority
type
estavam sendo atualizados antes que minha instrução Case pudesse ser executada, o que resultou em eles sempre parecendo iguais aos campos do banco de dados e nunca diferentes, então minha instrução Case era quase inútil. Movendo-o para o topo, agora funciona 100% corretamente.Espero que isso ajude alguém com um problema semelhante algum dia, já que muitas pessoas em 3 sites tentaram consertá-lo sem sucesso. Apenas movê-lo para o topo fez o truque, então a Ordem neste caso é muito importante! ] Obrigado a todos que contribuíram com seu tempo para tentar encontrar uma solução, sempre aprecio a ajuda que recebo nos sites da rede StackExchange!
Eu sugeriria retirar o sql in-line. Em seguida, crie um procedimento/gatilho que você possa aplicar os blocos adequados
IF
para capturar os valores absolutos que deseja ATUALIZAR. Por exemplo:Isso a.) eliminará seu sql em linha b.) permitirá verificações de integridade de dados c.) fornecerá a você uma instrução INSERT mais limpa de maneira programática.
Por sua vez, isso permitirá que você percorra a lógica que precisa realizar para o INSERT / UPDATE;