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 서버)에서 발생하지 않았습니다.

Table 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_1naslov :

krneki_2naslov에 대한 결과 :

+---------------+--------------+-------------+--------------+------------------+ | 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_2zaposlen에 대한 결과 :

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

krneki_2 with 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 (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) 

답변

오류 메시지는 매우 분명합니다. krneki_2 테이블에 id_naslov라는 열이 없습니다. 시스템 테이블에 약간의 손상이나 버그가 있지 않는 한 의심 할 여지가 없습니다.

따라서 이것이 나타나는 이유를 몇 가지 제거해야합니다.


  1. CREATE TABLE 문과 UPDATE 문이 일치하지 않습니다.

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

불일치는 이름 시작 부분의 공백입니다.

“Table”krneki_1 “doesn”t exist “ 오류가 발생 했어야하므로 두 가지 버전의 테이블 , 공백이없는 버전에는”id_naslov 열이 없습니다.

이 가능성을 제거했습니다. 복사 붙여 넣기 오류였습니다. OP에서.


  1. CREATE TABLE 및 는 동일하지 않습니다. 동일하게 보이지만 인쇄 할 수없는 문자가 있거나 동일하게 보이지만 코드 포인트가 다른 유니 코드 문자가있을 수 있습니다. 알아 내기 위해 다음 쿼리를 사용할 수 있습니다.

    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 ; 

답변

문제는 use <database>; 문을 실행하는 것을 잊고 결과적으로 올바른 데이터베이스에서 삽입을 실행하지 않았기 때문일 수 있습니다.

즉, 다른 데이터베이스에 있지만 구조가 다른 테이블에 삽입하려고 할 수 있습니다.

답변

문제 다중 테이블 UPDATEsDELETEs에 별칭이있을 수 있습니다. AS k2가 예상대로 작동하지 않는 경우를 발견했습니다. 별칭을 제거하고 테이블 이름을 사용하십시오.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다