Na minha tabela de anotações (banco de dados MySQL), tenho id como chave primária. Eu quero que a coluna originalid
seja o valor da chave primária. Aqui está a consulta que executo depois de criar um registro que pensei que funcionaria.
UPDATE notes SET originalid = (SELECT MAX(id) FROM notes) where id = (SELECT MAX(id) FROM notes);
Mas eu recebo o erro
Você não pode especificar 'notas' da tabela de destino para atualização na cláusula FROM
Algum conselho ou solução sobre como posso contornar isso?
Expliquei a mensagem de erro em uma postagem anterior há 4,5 anos ( Problema com a subconsulta do MySQL )
SUGESTÃO: Faça como duas consultas
ou
Você não pode simplesmente executar:
UPDATE notes SET originalid = id;
Certifique-se de que seus tipos de dados correspondam (por exemplo, se
id
forINT(11)
,originalid
também deve serINT(11)
.MAX(id) pode ter valores diferentes caso você tenha usuários simultâneos. Mesmo em uma transação, você pode ler valores diferentes em um nível de isolamento READ-COMMITTED e READ-UNCOMMITTED.
Apenas escreva exatamente o que você descreveu limitando a atualização a um subconjunto razoável de linhas. Por exemplo, executá-lo após sua inserção sempre definirá os valores corretos .
Isso atualizará apenas o originalid que ainda não foi definido e com o valor correto.
Observe também que você pode obter o último ID de inserção pela função LAST_INSERT_ID. https://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Portanto, isso também funcionaria (e você não precisa de um índice no originalid para ser eficaz)