Mysql
 sql >> база данни >  >> RDS >> Mysql

Филтрирайте нулев или празен вход, като използвате LOAD DATA INFILE в MySQL

Бих направил това, като филтрирам файла с grep или awk и след това го прехвърли в MySQL (чрез /dev/stdin ). Нещо като това:

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

Регулярният израз, даден на awk на втория ред просто съответства на всеки ред, който има знак табулация, последван от един или повече от всеки знак. Може да искате да го настроите, за да отговаря на вашите нужди.

Редактиране: Хрумна ми още една възможност. Можете да използвате SET за да зададете някаква магическа стойност на колони, които са празни и поставете BEFORE INSERT тригер на масата, който ще се откачи от ред, когато види тази стойност. Нямам много опит с тригерите, но мисля, че нещо подобно трябва да работи:

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
;

†: Съгласно документите :

Тогава...

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

Надявам се да е полезно!

Забележка 1: Съответна публикация и коментари в блог
Забележка 2: Уместна SO нишка




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL между клаузата не включва?

  2. MySQL Изберете различни стойности от 2 колони

  3. Дата и час срещу дата и час Mysql

  4. Как да обвържете datatable с времето за изпълнение на reportviewer

  5. Преброяване на броя на групираните редове в mysql