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

时间:2013-05-03 11:11:58

标签: mysql sql foreign-keys foreign-key-relationship

你好,我有一个关于各州的Mysql表(瑞士,我们这里没有州的州) 我把所有的部分加载到我的表中(来自瑞士邮政服务的本地数据)。 现在我想填写城市表(再次来自瑞士邮政服务的本地数据信息)。问题是我必须从广州获得FK。

城市文件确实有首字母缩写:“VS”,在广州,它保存为PK,姓名,缩写(例如:1,“Wallis”,“VS”)。

如果我想填写新表,我必须从广州获得FK的信息。我不想在城市表中使用initiales行。

表:

    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在每一行之后做什么,或者我怎么能在之后处理它?<​​/ p>

答案/已解决:

感谢Denis指向更新。 我现在用临时表来做这件事:

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 个答案:

答案 0 :(得分:0)

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