Загрузите данные в файл и получите внешний ключ из существующей таблицы


Привет там у меня есть таблица Mysql для кантонов (Швейцария у нас нет штатов ее кантон здесь) Я загрузил все кантоны в свою таблицу (локальный файл данных из swiss postalservice). Теперь я хочу заполнить таблицу городов (опять же локальные данные из файла swiss postalservice). Проблема в том, что я должен получить ФК из кантона.

В файле города есть инициалы canton ex: "VS", и в кантоне он сохраняется как PK, имя, инициалы (например: 1, "Wallis", "VS").

Если Я хочу заполнить новую таблицу, которую я должен получить в ФК из Кантона с этой информацией. Мне не нужна строка инициалов в таблице городов.

Таблицы:

    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;
1 2

1 ответ:

Отбросьте внешний ключ, загрузите данные с помощью FK_canton nullable и установите значение null, обновите таблицу, чтобы установить fkey в одном операторе, а затем повторно добавьте внешний ключ.