mysql使用LOAD DATA更新表

时间:2017-03-27 21:16:16

标签: mysql sql

所以我有人在csv(从我的桌子生成)上工作,他们将手动更新一些字段。这可能会多次发生。我想修改csv并更新我现有的表格。

根据我的理解,我需要创建一个tmp表,然后使用它来更新现有表。所以我可以创建临时表,但是如何遍历该表并使用它来更新现有表?

我的sql查询技巧非常基本。我认为这是可能的,但我不知道从哪里开始。

2 个答案:

答案 0 :(得分:1)

您不需要临时表。只需确保CSV文件包含表的主键。然后,您可以使用REPLACE中的LOAD DATA INFILE修饰符。来自documentation

  

如果指定REPLACE,则输入行将替换现有行。换句话说,主键或唯一索引的值与现有行具有相同的行。

答案 1 :(得分:1)

在生成的CSV中,您必须包含一个唯一值,以便将编辑后的记录与原始记录相匹配。确保用户不更改该列!另外,请确保该列上有唯一的密钥。

然后,您可以将编辑后的数据导入到与原始表格具有相同(或至少非常相似)结构的表格中。

导入数据后,可以使用INSERT ... ON DUPLICATE KEY UPDATE ...语句更新原始表。这是一个例子:

主要数据表:

DROP TABLE IF EXISTS `my_table`;

CREATE TABLE IF NOT EXISTS `my_table` (
    `id`        INT(10) UNSIGNED    NOT NULL        AUTO_INCREMENT                  COMMENT 'Primary Key',
    `fld1`      VARCHAR(100)        NULL,
    `fld2`      VARCHAR(100)        NULL,
    `fld3`      VARCHAR(100)        NULL,
    PRIMARY KEY (`id`)
) 
    ENGINE=MyISAM 
    AUTO_INCREMENT=1 
    DEFAULT CHARSET=utf8
    COLLATE=utf8_unicode_ci;

已编辑的CSV导入的临时表:

DROP TABLE IF EXISTS `import_table`;

CREATE TABLE IF NOT EXISTS `import_table` (
    `n_id`      INT(10)             NOT NULL    COMMENT 'Original Primary Key',
    `n_fld1`    VARCHAR(100)        NULL,
    `n_fld2`    VARCHAR(100)        NULL,
    `n_fld3`    VARCHAR(100)        NULL,
    PRIMARY KEY (`id`)
) 
    ENGINE=MyISAM 
    AUTO_INCREMENT=1 
    DEFAULT CHARSET=utf8
    COLLATE=utf8_unicode_ci;

导出和编辑前的模拟数据:

INSERT INTO `my_table`
(`fld1`,`fld2`,`fld3`)
VALUES
('John','Doe','Atlanta'),
('Jane','Smith','New York'),
('Bill','Howe','San Antonio'),
('Harry','Fields','Paris');

模拟导入的已编辑记录:

INSERT INTO `import_table`
(`n_id`,`n_fld1`,`n_fld2`,`n_fld3`)
VALUES
(1,'John','Doe','Decatur, IL'),
(2,'Jane','Smithsonian','New York, NY'),
(3,'Bill','Bellweather','San Antonio, TX'),
(4,'Harry','Belefonte','Houston, TX');

将导入的已编辑记录bak合并到主表中:

INSERT INTO `my_table`
(`id`,`fld1`,`fld2`,`fld3`)
SELECT `n_id`,`n_fld1`,`n_fld2`,`n_fld3` 
FROM `import_table`
ON DULPICATE KEY UPDATE
`fld1` = `n_fld1`,
`fld2` = `n_fld2`,
`fld3` = `n_fld3`;