観察#1
REPLACE
は実行しないでください 機械的なDELETE
だからです およびINSERT
。
MySQLドキュメント として REPLACEについて言う
パラグラフ2
パラグラフ5
REPLACEを使用すると、自動的に再利用できないTEST_IDの確立された値が破棄されます。
観察#2
テーブルレイアウトは、重複キーのトラップをサポートしません
名前が一意の場合、テーブルは次のようにレイアウトする必要があります
レイアウト#1
CREATE TABLE `oxygen_domain`.`TEST` (
`TEST_ID` int(11) NOT NULL AUTO_INCREMENT,
`NAME` varchar(255) NOT NULL,
`VALUE` varchar(255) DEFAULT NULL,
PRIMARY KEY (`TEST_ID`),
KEY (`NAME`)
)
名前で複数の値を使用できる場合は、テーブルを次のようにレイアウトする必要があります
レイアウト#2
CREATE TABLE `oxygen_domain`.`TEST` (
`TEST_ID` int(11) NOT NULL AUTO_INCREMENT,
`NAME` varchar(255) NOT NULL,
`VALUE` varchar(255) DEFAULT NULL,
PRIMARY KEY (`TEST_ID`),
KEY (`NAME`,`VALUE`)
)
提案されたソリューション
一時テーブルを使用してすべてをキャッチします。次に、レイアウトに基づいて一時テーブルから大きなINSERTを実行します
レイアウト#1
VALUE
を置き換えます 重複するNAME
の場合
USE oxygen_domain
DROP TABLE IF EXISTS `TESTLOAD`;
CREATE TABLE `TESTLOAD` SELECT NAME,VALUE FROM TEST WHERE 1=2;
LOAD DATA LOCAL INFILE 'C:/testData.txt'
INTO TABLE `TESTLOAD`
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(NAME, VALUE);
INSERT INTO `TEST` (NAME, VALUE)
SELECT NAME, VALUE FROM `TESTLOAD`
ON DUPLICATE KEY UPDATE VALUE = VALUES(VALUE);
DROP TABLE `TESTLOAD`;
レイアウト#2
重複する(NAME,VALUE)
を無視する 行
USE oxygen_domain
DROP TABLE IF EXISTS `TESTLOAD`;
CREATE TABLE `TESTLOAD` SELECT NAME,VALUE FROM TEST WHERE 1=2;
LOAD DATA LOCAL INFILE 'C:/testData.txt'
INTO TABLE `TESTLOAD`
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(NAME, VALUE);
INSERT IGNORE INTO `TEST` (NAME, VALUE)
SELECT NAME, VALUE FROM `TESTLOAD`;
DROP TABLE `TESTLOAD`;
更新
毎回テーブルの作成と削除を回避する必要がある場合。 TRUNCATE を切り捨てることができます INSERT...INTOステートメントを使用する前または後のテーブル。したがって、次回はテーブルを作成する必要はありません。