2

您好,我有一个适用于 Cantons 的 Mysql 表(瑞士我们在这里没有说明它的州)我已经将所有 Cantons 加载到我的表中(来自瑞士邮政服务的本地数据文件)。现在我想填写城市表(同样来自瑞士邮政服务的本地数据输入文件)。问题是我必须从广州获得 FK。

城市档案确实有州首字母,例如:“VS”,并且在州中保存为 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);

但它会先填充@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;
4

1 回答 1

0

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

于 2013-05-03T11:52:59.410 回答