Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mencoba melakukan LOAD DATA INFILE dengan REPLACE dan AUTO_INCREMENT

OBSERVASI #1

Anda tidak boleh melakukan REPLACE karena ini adalah DELETE mekanis dan INSERT .

Sebagai Dokumentasi MySQL mengatakan tentang REPLACE

Paragraf 2

Paragraf 5

Menggunakan REPLACE akan membuang nilai yang ditetapkan untuk TEST_ID yang tidak dapat digunakan kembali secara otomatis.

OBSERVASI #2

Tata letak tabel tidak akan mendukung perangkap kunci duplikat

Jika namanya unik, tabel harus ditata seperti ini

LAYOUT #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`)
) 

Jika sebuah nama memungkinkan beberapa nilai, tabel harus ditata seperti ini

LAYOUT #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`)
) 

SOLUSI YANG DIUSULKAN

Gunakan tabel temp untuk menangkap semuanya. Kemudian, lakukan INSERT besar dari tabel temp berdasarkan tata letak

LAYOUT #1

Ganti VALUE untuk NAME Duplikat

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

LAYOUT #2

Abaikan Duplikat (NAME,VALUE) baris

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

Perbarui

jika kita perlu menghindari membuat dan menjatuhkan tabel setiap saat. kita dapat MEMOTONG MENGORONG tabel sebelum atau sesudah menggunakan pernyataan INSERT...INTO. Oleh karena itu, kita tidak perlu membuat tabel lain kali.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengurutkan daftar array dalam zig-zag di PHP?

  2. Bagaimana saya bisa menambahkan komentar di MySQL?

  3. Bagaimana sprintf() melindungi dari injeksi SQL?

  4. Cara menulis kueri MySQL yang mengembalikan kolom sementara yang berisi tanda apakah item yang terkait dengan baris itu ada di tabel lain atau tidak

  5. Akses MySQL MAMP dari Terminal