web-dev-qa-db-ja.com

MySQL-既存のテーブルへのCSV更新(INSERTではない)?

次の列を持つテーブルがあります。

id | name | city

テーブルには1000のエントリがあります。

次のような限られた行数のCSVファイルがあります。

id,city
34,Denver
45,Kansas City
145,New York

使ってもいいですか LOAD DATA INFILE CSVをテーブルにインポートしますが、新しいエントリを挿入する代わりに、id列に基づいて行を更新しますか?

7
Jake Wilson

REPLACEは、DELETEおよびINSERTを機械的に実行します。これにより、主キーが変更される場合があります。

これが他にできることです。

テーブルの名前が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)
);

そして、あなたはLOAD DATA INFILEをやりたいと思っています。

IDに基づいて都市を更新する手順は次のとおりです。

ステップ01)インポートに使用する別のテーブルを作成する

CREATE TABLE name_city_import LIKE name_city;

手順02)インポートテーブルから名前列を削除する

ALTER TABLE name_city_import DROP COLUMN name;

ステップ03)name_city_importへのインポートを実行します

LOAD DATA INFILE 'somefile.csv' INTO TABLE name_city_import ...

ステップ04)UPDATE JOINを実行する

UPDATE name_city_import B
INNER JOIN name_city A USING (id)
SET A.city = B.city;

ステップ05)インポートテーブルを削除する

DROP TABLE name_city_import;

それでおしまい。

試してみる !!!

6
RolandoMySQLDBA

Idに一意のインデックスがある場合、またはそれが主キーである場合は、REPLACEを追加できます:LOAD DATA INFILE 'file_name' REPLACE ....

0
a1ex07