1. Introdução ao histórico
Esta é a minha mesa:
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| na | text | YES | | NULL | |
| birthDate | datetime | YES | | NULL | |
| class | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
Este é o código da tarefa que desejo concluir (objetivo: atualizar a classe de Zhang San para Li Si):
UPDATE test.student class
SET class = ( SELECT class FROM student WHERE student.na = '李四')
WHERE
student.na = '张三'
2. Encontrar problemas, pesquisar, resolver problemas ...
1. O primeiro problema encontrado-1054:
1054-Unknown column'student.na 'in'where clause',
então excluí o código para solucionar possíveis erros
UPDATE test.student class
SET class = 1
WHERE
student.na = '张三'
Descobri que o erro acima ainda existe, exclua a cláusula where e execute-o. A mensagem de erro diz [linha 'student.na', não reconhecida], estou muito intrigado, mas quando excluo o nome da tabela anterior "aluno" e executo sucesso!
UPDATE test.student class
SET class = 1
WHERE
na = '张三'
Portanto, imaginei que o comando update limita uma determinada tabela e o nome da tabela não pode ser adicionado de forma supérflua antes do nome da coluna.
Então mudei o código completo para:
UPDATE test.student class
SET class = ( SELECT class FROM student WHERE na = '李四')
WHERE
na = '张三'
2. Consulte também o erro -1093:
1093-Você não pode especificar a tabela de destino 'classe' para atualização na cláusula FROM.
Isso significa que você não pode selecionar certos valores na mesma tabela primeiro e, em seguida, atualizar a tabela (na mesma instrução),
que é o valor de o campo é julgado e, em seguida, o valor de um campo é atualizado.
Eu verifiquei na Internet e descobri que o MySQL não suporta este tipo de operação. Tudo é resolvido por "winding"
(de: https://zhidao.baidu.com/question/68619324.html).
Solução 1: Um
mais nível de aninhamento Subconsulta e, em seguida, exclua,
plano 2:
1. Crie uma tabela de retorno temporária, armazene automaticamente as condições a serem excluídas na tabela temporária:
2. Exclua os dados da tabela principal de acordo com a tabela temporária:
3. Finalmente, exclua o mesa temporária:
Não quero construir outra mesa, então usei a opção um:
UPDATE test.student class
SET class = (SELECT class from( SELECT class FROM student WHERE na = '李四') )
WHERE
na = '张三'
Aninhei uma camada fora de [(SELECIONE classe de (____))]
3. Mas há outro problema - 1248:
(Eu disse, essa frustração vem com muita frequência, o design é tão pouco intuitivo e sujeito a erros, não é à toa que os programadores perdem o cabelo)
1248-Cada tabela derivada deve ter seu próprio alias
continuar a pesquisar ... Encontre a resposta: https: / / blog.csdn.net/cao478208248/article/details/28122113
"Esta frase significa que cada tabela derivada deve ter seu próprio alias ... O resultado da subconsulta é como Uma tabela derivada é usada para a consulta de nível superior, então o o resultado da subconsulta deve ter um alias "
Então, eu imitei e adicionei [as t]
UPDATE test.student class
SET class = (SELECT class from( SELECT class FROM student WHERE na = '李四') as t )
WHERE
na = '张三'
Finalmente executado com sucesso!