sql >> Database teknologi >  >> RDS >> Mysql

Filtrer null eller tom input ved hjælp af LOAD DATA INFILE i MySQL

Jeg ville gøre dette ved at filtrere filen med grep eller awk og derefter overføre det til MySQL (via /dev/stdin ). Noget som dette:

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

Det regulære udtryk givet til awk på den anden linje matcher bare enhver linje, der har et tabulatortegn efterfulgt af et eller flere af et hvilket som helst tegn. Du ønsker måske at tilpasse den, så den passer til dine behov.

Rediger: En anden mulighed faldt mig ind. Du kan bruge SET for at sætte en eller anden magisk værdi på kolonner, der er tomme, og sætte en BEFORE INSERT udløser på bordet, der vil kautionere på en række, når den ser denne værdi. Jeg har ikke meget erfaring med triggere, men jeg tror, ​​at sådan noget burde virke:

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
;

†: I henhold til dokumenterne :

Så...

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

Håber det er nyttigt!

Bemærkning 1: Relevant blogindlæg og kommentarer
Bemærkning 2: Relevant SO-tråd




  1. Version vs Distrib-nummer af MySQL

  2. Gengiv com.mysql.jdbc.exceptions.jdbc4.CommunicationsException med en opsætning af Spring, Hibernate og C3P0

  3. MySQL simpel fejlforståelse

  4. SQL MELLEM-Smarte tips til at scanne efter en række værdier