Mysql 在文件中加载数据并从现有表中获取外键

Mysql 在文件中加载数据并从现有表中获取外键,mysql,sql,foreign-keys,foreign-key-relationship,Mysql,Sql,Foreign Keys,Foreign Key Relationship,您好,我有一个州的Mysql表(瑞士,我们这里没有州) 我已经将所有的州都加载到我的表中(本地数据由瑞士邮政服务提供)。 现在我想填写城市表(同样是来自瑞士邮政服务的本地数据填充)。问题是我必须从广州拿到FK 城市文件中有canton首字母,例如:“VS”,在canton中,它保存为PK、名称、首字母(例如:1,“Wallis”、“VS”) 如果我想填写新表格,我必须从Canton获得FK的信息。我不想在city表中使用缩写行 表: CREATE TABLE tbl_canton (

您好,我有一个州的Mysql表(瑞士,我们这里没有州) 我已经将所有的州都加载到我的表中(本地数据由瑞士邮政服务提供)。 现在我想填写城市表(同样是来自瑞士邮政服务的本地数据填充)。问题是我必须从广州拿到FK

城市文件中有canton首字母,例如:“VS”,在canton中,它保存为PK、名称、首字母(例如:1,“Wallis”、“VS”)

如果我想填写新表格,我必须从Canton获得FK的信息。我不想在city表中使用缩写行

表:

    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);
但它将首先填充@Cantonini,在加载所有内容后,它开始设置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;

删除外键,使用FK_canton nullable加载数据并设置为null,更新表以在一条语句中设置fkey,然后重新添加外键。

我尝试了稍微不同的路径,首先尝试更新,但没有成功我想我犯了一个错误。我现在正在使用一个临时表: