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

Filter input null atau kosong menggunakan LOAD DATA INFILE di MySQL

Saya akan melakukan ini dengan memfilter file dengan grep atau awk dan kemudian menyalurkannya ke MySQL (melalui /dev/stdin ). Sesuatu seperti ini:

cat your_file.txt |
  awk '/\t.+/' |
    mysql -u your_username -pyour_password \
      -e "LOAD DATA LOCAL INFILE '/dev/stdin' \
          IGNORE INTO TABLE tablename         \
          COLUMNS TERMINATED BY '\t'          \
          LINES TERMINATED BY '\n'            \
          (col1, col2);" \
      your_database_name

Ekspresi reguler yang diberikan kepada awk pada baris kedua hanya cocok dengan baris mana pun yang memiliki karakter tab diikuti oleh satu atau lebih karakter apa pun. Anda mungkin ingin menyesuaikannya agar sesuai dengan kebutuhan Anda.

Sunting: Satu kemungkinan lain terjadi pada saya. Anda dapat menggunakan SET untuk mengatur beberapa nilai ajaib pada kolom yang kosong dan beri tanda BEFORE INSERT pemicu di meja yang akan memberikan jaminan saat melihat nilai itu. Saya tidak memiliki banyak pengalaman dengan pemicu, tetapi saya pikir sesuatu seperti ini seharusnya berhasil:

CREATE TRIGGER skip_magic_rows
  BEFORE INSERT ON tablename
  FOR EACH ROW
  BEGIN
    IF NEW.col2 = 'IDSPISPOPD4815162342' THEN  # Some unlikely magic string
      # Trigger an error, which will cause the INSERT to fail†

      # If you have MySQL < 5.5 this is kludgy -- see Note 1
      DROP TABLE `Skipped row`

      # OR

      # In MySQL >= 5.5 you can send a signal--'45000' is a generic error
      SIGNAL SQLSTATE '45000' SET message_text = 'Skipped row';  # See Note 2

    END IF
  END
;

†: Sesuai dengan dokumen :

Lalu...

LOAD DATA LOCAL INFILE 'file' 
  IGNORE INTO TABLE tablename 
  COLUMNS TERMINATED BY '\t' 
  LINES TERMINATED BY '\n'
  (col1, @var2)
  SET col2 = IF(@var2 IN (NULL, ''), 'IDSPISPOPD4815162342', @var2)
;

Semoga bermanfaat!

Catatan 1: Komentar dan komentar blog yang relevan
Catatan 2: utas SO yang relevan




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysqldump:Bisakah Anda mengubah nama tabel yang Anda masukkan?

  2. Menemukan postingan dengan tag1 DAN tag2? (menggunakan tabel gabungan) Ada / Memiliki / subqueries... Apa yang harus digunakan?

  3. sekuel di mana klausa tanggal

  4. Apakah MySQL foreign_key_checks memengaruhi seluruh basis data?

  5. Bagaimana cara meningkatkan Query MySQL ini menggunakan join?