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)
Pesquisei e li outros posts na rede, mas nada ajuda …
Acho que é “uma solução trivial mas simplesmente não consigo ver.
Este tipo de erro nunca apareceu no TSQL (servidor sql).
A tabela krneki_2 foi criada pelo ambiente de trabalho Mysql via importação de dados (criar novo tabela) posteriormente, quando esse erro ocorreu, também alterei os campos de número para smallint apenas para ver se isso 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
:
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)
Pesquisas adicionais, conforme 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)
Resposta
A mensagem de erro é bastante clara. A tabela krneki_2
não possui uma coluna chamada id_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:
-
Existem incompatibilidades entre as
CREATE TABLE
instruções e asUPDATE
:CREATE TABLE ` krneki_1` ... CREATE TABLE ` krneki_2` ... UPDATE krneki_1 AS U1, krneki_2 AS U2 ...
A incompatibilidade é um espaço no início dos nomes.
Isso deve ter dado um erro de “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 a coluna id_naslov
.
Eliminamos essa possibilidade, era um erro de copiar e colar do OP.
-
O nome da coluna em
CREATE TABLE
eUPDATE
não são idênticos. Eles podem ter a mesma aparência, mas podem 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:select table_catalog, table_schema, table_name, column_name, ordinal_position, char_length(column_name) as cl, length(column_name) as l, hex(column_name) as hex from information_schema.columns where table_name = "krneki_2" ;
que revela a diferença (colunas não necessárias removidas da saída) :
+------------+-------------+------------------+----+----+ | table_name | column_name | ordinal_position | cl | l | +------------+-------------+------------------+----+----+ | krneki_2 | id | 1 | 2 | 2 | | krneki_2 | id_naslov | 2 | 10 | 12 | -- !!! -- | krneki_2 | id_zaposlen | 3 | 11 | 11 | +------------+-------------+------------------+----+----+
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 estranho está acontecendo lá.
Você pode adicione hex(column_name)
na lista de seleção desta última consulta e saberemos qual é exatamente o nome da coluna. Então você pode alterá-lo para ter apenas caracteres ascii imprimíveis.
Para corrigir, você precisa de algo assim:
set @column := X"EFBBBF69645F6E61736C6F76" ; set @qry:= concat("alter table krneki_2 change column ", @column, " id_naslov smallint") ; prepare stmt from @qry ; execute stmt ;
Resposta
O problema pode ser que você tenha esquecido de executar uma instrução use <database>;
e, conseqüentemente, 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.
Resposta
O problema pode ser com aliases em várias tabelas UPDATEs
e DELETEs
. Encontrei casos em que AS k2
não funciona como esperado. Remova os aliases e simplesmente use os nomes das tabelas.