2013-05-03 1 views
2

안녕하세요. 광저우 (스위스는 여기에 주 (州)가 없다는 스위스)에 대한 MySQL 테이블이 있습니다. 내 테이블에 모든 캔톤을로드했습니다 데이터는 스위스 우편 서비스에서 infile). 이제 도시 표를 채우고 싶습니다 (스위스 우편 서비스에서 다시 로컬 데이터 infile). 문제는 광저우에서 FK를 가져와야한다는 것입니다.파일에 데이터로드 및 기존 테이블에서 외래 키 얻기

도시 파일에는 canton 이니셜 (예 : "VS")이 있으며 캔톤에서는 PK, 이름, 이니셜 (예 : 1, "월리스", "VS")으로 저장됩니다.

새 테이블을 채우려면 해당 정보로 광저우에서 FK를 가져와야합니다. 나는 도시 표에 이니셜 열이 있기를 원하지 않는다.

테이블 : 나는 tryed했습니다

CREATE TABLE tbl_canton (
     PK_canton INT NOT NULL AUTO_INCREMENT, 
     canton_name VARCHAR(45) NOT NULL, 
     canton_initiales VARCHAR(2) NOT NULL, 
     PRIMARY KEY (PK_canton) 
    ); 

    CREATE TABLE tbl_city (
     PK_city INT NOT NULL AUTO_INCREMENT, 
     city_name VARCHAR(45) NOT NULL, 
     city_zipcode INT NOT NULL, 
     FK_canton INT NOT NULL, 
     PRIMARY KEY (PK_city), 
     FOREIGN KEY (FK_canton) REFERENCES db_eventengine.tbl_canton (PK_canton) 
    ); 

:

LOAD DATA LOCAL INFILE 'c:/temp/tbl_city.csv' INTO TABLE tbl_city FIELDS TERMINATED BY ';' 
    OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' 
    (PK_city, city_name, city_zipcode, @cantoninit) 
    SET FK_canton = (SELECT PK_canton FROM tbl_canton WHERE @cantoninit = canton_initiales); 

그러나 처음 @cantoninit을 채울 것이며, 모든이에로드 된 후에는 FK를 설정하기 시작합니다. 모든 행이 끝날 때마다 MySql에 지시하거나 나중에 처리 할 수 ​​있습니까? 이 해결

답변/:

감사 데니스 업데이트를 가리키는합니다. 지금은 임시 테이블 함께 할 다음 다시 추가

DROP TABLE IF EXISTS tbl_temp; 
CREATE TABLE tbl_temp (
    temp_PK_city INT NOT NULL AUTO_INCREMENT, 
    temp_city_name VARCHAR(45) NOT NULL, 
    temp_city_zipcode INT NOT NULL, 
    temp_FK_canton VARCHAR(2), 
    PRIMARY KEY (temp_PK_city) 
); 

DELETE FROM tbl_temp; 
LOAD DATA LOCAL INFILE 'c:/temp/tbl_city.csv' INTO TABLE tbl_temp FIELDS TERMINATED BY ';' 
    OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' 
    (temp_PK_city, temp_city_name, temp_city_zipcode, temp_FK_canton); 

    INSERT INTO tbl_city (city_name, city_zipcode, FK_canton) 
    SELECT temp_city_name, temp_city_zipcode, tbl_canton.PK_canton 
    FROM tbl_temp, tbl_canton 
    WHERE temp_FK_canton = tbl_canton.canton_initiales; 

DROP TABLE tbl_temp; 

답변

0

드롭 외국 키를 누른 다음 FK_canton의 널 (NULL)로 데이터를로드하고 null로 설정 한 문에서 fkey을 설정하기 위해 테이블을 업데이트하고, 외래 키.

+0

처음에는 약간 다른 경로로 업데이트를 시도했지만 작동하지 않았습니다. 내가 실수 한 것 같습니다. 임시 테이블로 작업 중입니다. – TheCell