所以我有人在csv(从我的桌子生成)上工作,他们将手动更新一些字段。这可能会多次发生。我想修改csv并更新我现有的表格。
根据我的理解,我需要创建一个tmp表,然后使用它来更新现有表。所以我可以创建临时表,但是如何遍历该表并使用它来更新现有表?
我的sql查询技巧非常基本。我认为这是可能的,但我不知道从哪里开始。
答案 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`;