Error: Code 1054. Unknown column "U2.id_naslov" in "field list"
wird in MySQL Workbench auf diese einfache Abfrage geworfen :
UPDATE krneki_1 AS U1, krneki_2 AS U2 SET U1.id_naslov = U2.id_naslov WHERE (U2.id_zaposlen = U1.id_naslovi_zaposleni)
Ich habe andere Beiträge im Internet gesucht und gelesen, aber nichts hilft …
Ich denke, es ist eine triviale Lösung aber ich kann es einfach nicht sehen.
Diese Art von Fehler trat bei TSQL (SQL Server) nie auf.
Die Tabelle krneki_2 wurde von der MySQL-Workbench über den Datenimport erstellt (neu erstellen) Tabelle) später, als dieser Fehler auftrat, änderte ich auch die Zahlenfelder in smallint, um zu sehen, ob es hilft … aber … nichts.
Ergebnis von 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)
Ergebnis von 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)
Ergebnisse von information_schema
, speziell aus dieser in Kommentaren vorgeschlagenen Abfrage:
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%" ;
Ergebnisse für krneki_1
und naslov
:
Ergebnisse für krneki_2
und 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)
Ergebnisse für krneki_2
und 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)
Weiteres Graben, wie vorgeschlagen:
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" ;
Ergebnisse für 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)
Ergebnisse für 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 mit 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 mit 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)
Antwort
Die Fehlermeldung ist ganz klar. Die Tabelle krneki_2
enthält keine Spalte mit dem Namen id_naslov
. Es gibt keine Frage, es sei denn, es gibt eine Beschädigung in Systemtabellen oder einen Fehler.
Wir müssen also mehrere Möglichkeiten ausschließen, warum dies auftritt:
-
Es gibt Abweichungen zwischen den Anweisungen
CREATE TABLE
und den AnweisungenUPDATE
:CREATE TABLE ` krneki_1` ... CREATE TABLE ` krneki_2` ... UPDATE krneki_1 AS U1, krneki_2 AS U2 ...
Die Nichtübereinstimmung ist ein Leerzeichen am Anfang der Namen.
Dies sollte den Fehler „Tabelle“ krneki_1 „nicht vorhanden“ ergeben haben. Ich vermute also, dass Sie zwei Versionen der Tabelle , und die Version ohne Leerzeichen hat nicht die Spalte id_naslov
.
Wir haben diese Möglichkeit ausgeschlossen, es war ein Fehler beim Kopieren und Einfügen aus dem OP.
-
Der Spaltenname im
CREATE TABLE
und imUPDATE
sind nicht identisch. Sie sehen möglicherweise gleich aus, es können jedoch nicht druckbare Zeichen vorhanden sein, oder es können Unicode-Zeichen vorhanden sein, die gleich aussehen, aber unterschiedliche Codepunkte sind. Um dies herauszufinden, können wir diese Abfrage verwenden: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" ;
, die den Unterschied aufzeigt (nicht benötigte Spalten aus der Ausgabe entfernt) :
+------------+-------------+------------------+----+----+ | 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 | +------------+-------------+------------------+----+----+
Hinweis 12 ist größer als 10 und es gibt das Problem! Dies bedeutet, dass der Spaltenname 10 Zeichen hat und 12 Bytes verwendet. Diese Zahlen sollten beide 9 sein (wenn wir id_naslov
richtig zählen und wenn alle 9 Zeichen ASCII waren), damit dort etwas faul ist.
Sie können Fügen Sie hex(column_name)
in die Auswahlliste dieser letzten Abfrage ein, und wir werden wissen, wie der Spaltenname genau lautet. Dann können Sie ihn so ändern, dass er nur druckbare ASCII-Zeichen enthält.
Um dies zu beheben, benötigen Sie Folgendes:
set @column := X"EFBBBF69645F6E61736C6F76" ; set @qry:= concat("alter table krneki_2 change column ", @column, " id_naslov smallint") ; prepare stmt from @qry ; execute stmt ;
Antwort
Das Problem kann sein, dass Sie vergessen haben, eine use <database>;
-Anweisung auszuführen, und folglich die Einfügung nicht in der richtigen Datenbank ausgeführt haben.
Mit anderen Worten, Sie Möglicherweise wird versucht, in eine Tabelle einzufügen, die in einer anderen Datenbank vorhanden ist, jedoch eine andere Struktur aufweist.
Antwort
Das Problem kann mit Aliasen in UPDATEs
und DELETEs
mit mehreren Tabellen sein. Ich habe Fälle gefunden, in denen AS k2
nicht wie erwartet funktioniert. Entfernen Sie die Aliase und verwenden Sie einfach die Tabellennamen.