观察#1
你不应该这样做REPLACE
,因为它是机械DELETE
和INSERT
.
正如MySQL 文档所说的关于 REPLACE
第 2 段
REPLACE 是对 SQL 标准的 MySQL 扩展。它要么插入,要么删除和插入。对于标准 SQL 的另一个 MySQL 扩展(插入或更新),请参阅第 13.2.5.3 节,“INSERT ... ON DUPLICATE KEY UPDATE 语法”。
第 5 段
要使用 REPLACE,您必须同时拥有该表的 INSERT 和 DELETE 权限。
使用 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`;
更新
如果我们需要避免每次创建和删除表。我们可以在使用 INSERT...INTO 语句之前或之后TRUNCATE TRUNCATE表。因此,我们下次不必创建表。