web-dev-qa-db-fra.com

Erreur de requête de mise à jour mysql Code 1054 colonne inconnue dans la liste des champs

Error: Code 1054. Unknown column 'U2.id_naslov' in 'field list' est jeté sur cette simple requête dans 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'ai cherché et lu d'autres articles sur le net mais rien n'y fait ...

Je suppose que c'est une solution triviale mais je ne la vois tout simplement pas.

Ce type d'erreur n'est jamais apparu sur TSQL (serveur SQL).

La table krneki_2 a été créée par Mysql Workbench via l'importation de données (créer une nouvelle table) plus tard lorsque cette erreur s'est produite. J'ai également modifié les champs numériques en petits caractères juste pour voir si cela aide ... mais ... rien.

Résultat 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)

Résultat 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)

Résultats de information_schema, spécifiquement à partir de cette requête suggérée dans les commentaires:

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%' ;

Résultats pour krneki_1 et 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)

Résultats pour krneki_2 et 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)

Résultats pour krneki_2 et 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)

Creuser davantage, comme suggéré:

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' ;

Résultats pour 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)

Résultats pour 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 avec 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 avec 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)
4
nobsvalo

Le message d'erreur est assez clair. La table krneki_2 N'a pas de colonne nommée id_naslov. À moins qu'il y ait une corruption dans les tables système ou un bogue, cela ne fait aucun doute.

Nous devons donc éliminer plusieurs possibilités pour lesquelles cela apparaît:


  1. Il existe des décalages entre les instructions CREATE TABLE Et les UPDATE:

    CREATE TABLE ` krneki_1` ...
    
    CREATE TABLE ` krneki_2` ...
    
    UPDATE krneki_1 AS U1, krneki_2 AS U2 ...
    

Le décalage est un espace au début des noms.

Cela aurait dû donner une erreur de "La table 'krneki_1' n'existe pas" donc ma supposition éclairée est que vous avez deux versions de la table krneki_1, Et la version sans l'espace n'a pas la colonne id_naslov.

Nous avons éliminé cette possibilité, c'était une erreur de copier-coller de l'OP.


  1. Le nom de colonne dans CREATE TABLE Et UPDATE ne sont pas identiques. Ils peuvent avoir la même apparence mais il peut y avoir des caractères non imprimables ou ils peuvent avoir des caractères Unicode qui se ressemblent mais sont des points de code différents. Pour le savoir, nous pouvons utiliser cette requête:

    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' ;
    

qui révèle la différence (colonnes non nécessaires supprimées de la sortie):

+------------+-------------+------------------+----+----+
| 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 |     
+------------+-------------+------------------+----+----+

La note 12 est supérieure à 10 et il y a le problème! Cela signifie que le nom de la colonne a 10 caractères et utilise 12 octets. Ces nombres devraient tous les deux être 9 (si nous comptons id_naslov Correctement et si tous les 9 caractères étaient ASCII), donc quelque chose de louche se passe là-bas.

Vous pouvez ajouter hex(column_name) dans la liste de sélection de cette dernière requête et nous saurons quel est exactement le nom de la colonne. Ensuite, vous pouvez le modifier pour n'avoir que des caractères ascii imprimables.

Pour résoudre ce problème, vous avez besoin de quelque chose comme ceci:

set @column := X'EFBBBF69645F6E61736C6F76' ;  
set @qry:= concat('alter table krneki_2 change column ', 
                  @column, 
                  ' id_naslov smallint') ;
prepare stmt from @qry ;
execute stmt ;
8
ypercubeᵀᴹ