Error: Code 1054. Unknown column 'U2.id_naslov' in 'field list'
は、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)
私はネット上の他の投稿を検索して読みましたが、何も役に立ちません...
それは簡単な解決策だと思いますが、私はそれを見ることができません。
この種のエラーはTSQL(SQLサーバー)では発生しませんでした。
テーブルkrneki_2は、後でこのエラーが発生したときにデータインポート(新しいテーブルの作成)を介してMysqlワークベンチによって作成されました。数値フィールドをsmallintに変更して、役立つかどうかを確認しましたが...
の結果 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)
の結果 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)
から得られる結果 information_schema
、特にコメントで提案されているこのクエリから:
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%' ;
の結果 krneki_1
および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)
の結果 krneki_2
および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)
の結果 krneki_2
および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)
提案通り、さらに掘り下げる:
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' ;
の結果 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)
の結果 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)
hEX付きのkrneki_2:
+-------------+------------+----------+-----------+----------------+--+--+-------------------------+
|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)
hEX付きのkrneki_1:
+-------------+------------+----------+--------------------+----------------+--+--+----------------------------------------+
|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)
エラーメッセージは非常に明確です。テーブル_krneki_2
_には、_id_naslov
_という名前の列がありません。システムテーブルに何らかの破損やバグがない限り、それについての疑問はありません。
したがって、これが表示される理由をいくつか排除する必要があります。
_CREATE TABLE
_ステートメントとUPDATE
の間に不一致があります:
_CREATE TABLE ` krneki_1` ...
CREATE TABLE ` krneki_2` ...
UPDATE krneki_1 AS U1, krneki_2 AS U2 ...
_
不一致は、名前の先頭のスペースです。
これは"Table 'krneki_1' does not exist"のエラーを発生させるはずだったので、私の推測では、2つのバージョンのテーブル_krneki_1
_があり、スペースのないバージョンでは_id_naslov
_列がありません。
この可能性を排除しました。OPからのコピーペーストエラーでした。
_CREATE TABLE
_とUPDATE
の列名は同じではありません。それらは同じに見えるかもしれませんが、印刷できない文字があるか、または同じに見えるが異なるコードポイントであるUnicode文字がある可能性があります。調べるには、次のクエリを使用できます。
_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' ;
_
違いを明らかにします(出力から削除された不要な列):
_+------------+-------------+------------------+----+----+
| 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 |
+------------+-------------+------------------+----+----+
_
注12は10より大きく、問題があります!つまり、列名は10文字で、12バイトを使用します。これらの数値は両方とも9(_id_naslov
_を正しくカウントし、9文字がすべてASCIIである場合)であるため、何か不思議なことが起こっています。
この最後のクエリの選択リストにhex(column_name)
を追加すると、列名が正確にわかります。次に、印刷可能なASCII文字のみを含むように変更できます。
修正するには、次のようなものが必要です。
_set @column := X'EFBBBF69645F6E61736C6F76' ;
set @qry:= concat('alter table krneki_2 change column ',
@column,
' id_naslov smallint') ;
prepare stmt from @qry ;
execute stmt ;
_