Error: Code 1054. Unknown column 'U2.id_naslov' in 'field list'
é lançado nesta consulta simples no MySQL Workbench:
UPDATE krneki_1 AS U1, krneki_2 AS U2
SET U1.id_naslov = U2.id_naslov
WHERE (U2.id_zaposlen = U1.id_naslovi_zaposleni)
Já pesquisei e li outros posts na net mas nada ajuda...
Eu acho que é uma solução trivial, mas eu simplesmente não consigo vê-la.
Esse tipo de erro nunca apareceu no TSQL (servidor sql).
A tabela krneki_2 foi criada pelo Mysql workbench via importação de dados (criar nova tabela) mais tarde, quando ocorreu esse erro, também alterei os campos numéricos para smallint apenas para ver se ajuda... mas... nada.
Resultado de SHOW CREATE TABLE krneki_2
:
Table: krneki_2
Create Table: CREATE TABLE `krneki_2`
( `id` smallint(6) NOT NULL AUTO_INCREMENT,
`id_naslov` smallint(6) NOT NULL,
`id_zaposlen` smallint(6) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=204 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
Resultado de SHOW CREATE TABLE krneki_1
:
Table: krneki_1
Create Table: CREATE TABLE `krneki_1` (
`id_naslovi_zaposleni` smallint(6) NOT NULL AUTO_INCREMENT,
`id_naslov` smallint(6) DEFAULT NULL,
`id_zaposleni` smallint(6) DEFAULT NULL,
`id_aktiven` tinyint(4) DEFAULT '0',
`cas_vnosa` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id_naslovi_zaposleni`)
) ENGINE=InnoDB AUTO_INCREMENT=256 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
Resultados de information_schema
, especificamente desta consulta sugerida nos comentários:
select
table_catalog, table_schema, table_name, column_name, ordinal_position
from information_schema.columns
where table_name like '%krneki_1%' and column_name like '%naslov%' ;
Resultados para krneki_1
e naslov
:
+---------------+--------------+-------------+----------------------+------------------+
| table_catalog | table_schema | table_name | column_name | ordinal_position |
+---------------+--------------+-------------+----------------------+------------------+
| def | hq_db | krneki_1 | id_naslovi_zaposleni | 1 |
| def | hq_db | krneki_1 | id_naslov | 2 |
+---------------+--------------+-------------+----------------------+------------------+
2 rows in set (0.00 sec)
Resultados para krneki_2
e naslov
:
+---------------+--------------+-------------+--------------+------------------+
| table_catalog | table_schema | table_name | column_name | ordinal_position |
+---------------+--------------+-------------+--------------+------------------+
| def | hq_db | krneki_2 | id_naslov | 2 |
+---------------+--------------+-------------+--------------+------------------+
1 row in set (0.00 sec)
Resultados para krneki_2
e zaposlen
:
+---------------+--------------+-------------+--------------+------------------+
| table_catalog | table_schema | table_name | column_name | ordinal_position |
+---------------+--------------+-------------+--------------+------------------+
| def | hq_db | krneki_2 | id_zaposlen | 3 |
+---------------+--------------+-------------+--------------+------------------+
1 row in set (0.00 sec)
Mais escavações, como sugerido:
select
table_catalog, table_schema, table_name, column_name, ordinal_position,
char_length(column_name) as cl, length(column_name) as l
from information_schema.columns
where table_name = 'krneki_2' ;
Resultados para krneki_2
:
+-------------+------------+----------+-----------+----------------+---+---+-------------+
|table_catalog|table_schema|table_name|column_name|ordinal_position| cl| l | column_type |
+-------------+------------+----------+-----------+----------------+---+---+-------------+
| def | hq_db | krneki_2 |id | 1 | 2| 2| smallint(6) |
| def | hq_db | krneki_2 |id_naslov | 2 | 10| 12| smallint(6) |
| def | hq_db | krneki_2 |id_zaposlen| 3 | 11| 11| smallint(6) |
+-------------+------------+----------+-----------+----------------+---+---+-------------+
3 rows in set (0.00 sec)
Resultados para krneki_1
:
+-------------+------------+----------+--------------------+----------------+--+--+-----------+
|table_catalog|table_schema|table_name| column_name |ordinal_position|cl| l|column_type|
+-------------+------------+----------+--------------------+----------------+--+--+-----------+
| def | hq_db | krneki_1 |id_naslovi_zaposleni| 1 |20|20|smallint(6)|
| def | hq_db | krneki_1 |id_naslov | 2 | 9| 9|smallint(6)|
| def | hq_db | krneki_1 |id_zaposleni | 3 |12|12|smallint(6)|
| def | hq_db | krneki_1 |id_aktiven | 4 |10|10|tinyint(4) |
| def | hq_db | krneki_1 |cas_vnosa | 5 | 9| 9|datetime |
+-------------+------------+----------+--------------------+----------------+--+--+-----------+
5 rows in set (0.00 sec)
krneki_2 com HEX:
+-------------+------------+----------+-----------+----------------+--+--+-------------------------+
|table_catalog|table_schema|table_name|column_name|ordinal_position|cl|l | hex |
+-------------+------------+----------+-----------+----------------+--+--+-------------------------+
| def | hq_db | krneki_2 |id | 1 | 2| 2|6964 |
| def | hq_db | krneki_2 |id_naslov | 2 |10|12|EFBBBF69645F6E61736C6F76 |
| def | hq_db | krneki_2 |id_zaposlen| 3 |11|11|69645F7A61706F736C656E |
+-------------+------------+----------+-----------+----------------+--+--+-------------------------+
3 rows in set (0.00 sec)
krneki_1 com HEX:
+-------------+------------+----------+--------------------+----------------+--+--+----------------------------------------+
|table_catalog|table_schema|table_name|column_name |ordinal_position|cl| l|hex |
+-------------+------------+----------+--------------------+----------------+--+--+----------------------------------------+
| def | hq_db | krneki_1 |id_naslovi_zaposleni| 1 |20|20|69645F6E61736C6F76695F7A61706F736C656E69|
| def | hq_db | krneki_1 |id_naslov | 2 | 9| 9|69645F6E61736C6F76 |
| def | hq_db | krneki_1 |id_zaposleni | 3 |12|12|69645F7A61706F736C656E69 |
| def | hq_db | krneki_1 |id_aktiven | 4 |10|10|69645F616B746976656E |
| def | hq_db | krneki_1 |cas_vnosa | 5 | 9| 9|6361735F766E6F7361 |
+-------------+------------+----------+--------------------+----------------+--+--+----------------------------------------+
5 rows in set (0.00 sec)
A mensagem de erro é bastante clara. A tabela
krneki_2
não tem uma coluna chamadaid_naslov
. A menos que haja alguma corrupção nas tabelas do sistema ou um bug, não há dúvida sobre isso.Portanto, temos que eliminar várias possibilidades de por que isso aparece:
Há incompatibilidades entre as
CREATE TABLE
declarações e oUPDATE
:A incompatibilidade é um espaço no início dos nomes.
Isso deveria ter dado um erro de "A tabela 'krneki_1' não existe" , então meu palpite é que você tem duas versões da tabela
krneki_1
e a versão sem o espaço não tem aid_naslov
coluna.Eliminamos essa possibilidade, foi um erro de copiar e colar do OP.
O nome da coluna no
CREATE TABLE
e noUPDATE
não são idênticos. Eles podem ter a mesma aparência, mas pode haver caracteres não imprimíveis ou podem ter caracteres Unicode que parecem iguais, mas são pontos de código diferentes. Para descobrir, podemos usar esta consulta:que revela a diferença (colunas não necessárias removidas da saída):
A nota 12 é maior que 10 e aí está o problema! Isso significa que o nome da coluna tem 10 caracteres e usa 12 bytes. Esses números devem ser 9 (se contarmos
id_naslov
corretamente e se todos os 9 caracteres forem ASCII), então algo suspeito está acontecendo lá.Você pode adicionar
hex(column_name)
na lista de seleção desta última consulta e saberemos exatamente qual é o nome da coluna. Então você pode alterá-lo para ter apenas caracteres ASCII imprimíveis.Para corrigir, você precisa de algo assim:
O problema pode ser que você esqueceu de executar uma
use <database>;
instrução e, consequentemente, não estava executando a inserção no banco de dados correto.Em outras palavras, você pode estar tentando inserir em uma tabela que existe em um banco de dados diferente, mas com uma estrutura diferente.
O problema pode estar com aliases em várias tabelas
UPDATEs
e arquivosDELETEs
. Encontrei casos emAS k2
que não funciona como seria de esperar. Remova os aliases e simplesmente use os nomes das tabelas.