我有一个包含以下列的表格:
id | name | city
Run Code Online (Sandbox Code Playgroud)
该表中有 1000 个条目。
我有一个行数有限的 CSV 文件,如下所示:
id,city
34,Denver
45,Kansas City
145,New York
Run Code Online (Sandbox Code Playgroud)
我可以LOAD DATA INFILE用来将我的 CSV 导入到我的表中,而不是插入新条目,而是根据id列更新行吗?
REPLACE机械地运行DELETE和INSERT。这可能会改变 PRIMARY KEY。
这是您可以做的其他事情。
假设您的表名为 name_city,它看起来像这样:
CREATE TABLE name_city
(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(30) NOT NULL,
city VARCHAR(30) NOT NULL,
PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)
并且您想要执行LOAD DATA INFILE.
以下是根据 id 更新城市的步骤:
步骤 01) 创建另一个用于导入的表
CREATE TABLE name_city_import LIKE name_city;
Run Code Online (Sandbox Code Playgroud)
步骤 02) 从导入表中删除名称列
ALTER TABLE name_city_import DROP COLUMN name;
Run Code Online (Sandbox Code Playgroud)
步骤 03) 执行导入 name_city_import
LOAD DATA INFILE 'somefile.csv' INTO TABLE name_city_import ...
Run Code Online (Sandbox Code Playgroud)
步骤 04) 执行 UPDATE JOIN
UPDATE name_city_import B
INNER JOIN name_city A USING (id)
SET A.city = B.city;
Run Code Online (Sandbox Code Playgroud)
步骤 05) 删除导入表
DROP TABLE name_city_import;
Run Code Online (Sandbox Code Playgroud)
就是这样。
试一试 !!!
如果 id 上有唯一索引或者它是主键,则可以添加REPLACE:LOAD DATA INFILE 'file_name' REPLACE ....