sql >> Databáze >  >> RDS >> Mysql

Pokuste se provést LOAD DATA INFILE pomocí REPLACE a AUTO_INCREMENT

POZOR #1

Neměli byste provádět REPLACE protože se jedná o mechanické DELETE a INSERT .

Jako Dokumentace MySQL říká o REPLACE

Odstavec 2

Odstavec 5

Použití REPLACE odstraní zavedené hodnoty pro TEST_ID, které nelze automaticky znovu použít.

POZOR #2

Rozvržení tabulky nebude podporovat zachycování duplicitních klíčů

Pokud je název jedinečný, tabulka by měla být uspořádána takto

ROZVRŽENÍ #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`)
) 

Pokud název umožňuje více hodnot, tabulka by měla být uspořádána takto

ROZVRŽENÍ #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`)
) 

NAVRHOVANÉ ŘEŠENÍ

K zachycení všeho použijte tabulku temp. Poté proveďte velký INSERT z dočasné tabulky na základě rozložení

ROZVRŽENÍ #1

Nahraďte VALUE pro duplikát 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`;

ROZVRŽENÍ #2

Ignorovat duplicitní (NAME,VALUE) řádky

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`;

Aktualizovat

pokud se potřebujeme vyhnout pokaždé vytváření a pouštění tabulky. můžeme ZKRÁTIT ZKRÁTIT tabulky před nebo po použití příkazu INSERT...INTO. Příště tedy tabulku vytvářet nemusíme.



  1. Nastavte počáteční hodnotu pro sloupec s automatickým přírůstkem

  2. Existuje způsob, jak nainstalovat javu na Oracle 11g XE?

  3. Před vložením zkontrolujte, zda řádek v databázi existuje

  4. Spuštění více instancí PostgreSQL na jednom hostiteli