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

Filtrujte prázdný nebo prázdný vstup pomocí LOAD DATA INFILE v MySQL

Udělal bych to filtrováním souboru pomocí grep nebo awk a poté jej vložit do MySQL (přes /dev/stdin ). Něco jako toto:

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

Regulární výraz daný výrazu awk na druhém řádku odpovídá pouze libovolnému řádku, který má znak tabulátoru následovaný jedním nebo více libovolnými znaky. Možná ho budete chtít vyladit, aby vyhovoval vašim potřebám.

Upravit: Napadla mě ještě jedna možnost. Můžete použít SET pro nastavení nějaké magické hodnoty na sloupce, které jsou prázdné, a vložte BEFORE INSERT trigger na stole, který bude kauce na řádku, když uvidí tuto hodnotu. Se spouštěči nemám moc zkušeností, ale myslím, že by něco takového mělo fungovat:

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
;

†: Podle dokumentů :

Pak...

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

Doufám, že to bude užitečné!

Poznámka 1: Relevantní blogový příspěvek a komentáře
Poznámka 2: Relevantní vlákno SO




  1. sql server:odstraňte všechny řádky všech tabulek

  2. Chyba duplicitního klíče zamykání MySQL

  3. Kontrola hodnoty v poli uvnitř jednoho SQL dotazu s klauzulí WHERE

  4. Adminer – Pokročilý nástroj pro správu webových databází pro Linux