Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Filtre a entrada nula ou vazia usando LOAD DATA INFILE no MySQL


Eu faria isso filtrando o arquivo com grep ou awk e, em seguida, canalizando-o para o MySQL (via /dev/stdin ). Algo assim:
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

A expressão regular dada a awk na segunda linha corresponde apenas a qualquer linha que tenha um caractere de tabulação seguido por um ou mais de qualquer caractere. Você pode querer ajustá-lo para atender às suas necessidades.

Editar: Uma outra possibilidade me ocorreu. Você pode usar SET para definir algum valor mágico em colunas que estão em branco e colocar um BEFORE INSERT acionador na tabela que irá disparar em uma linha quando vir esse valor. Não tenho muita experiência com gatilhos, mas acho que algo assim deve funcionar:
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
;

†: De acordo com os documentos :

Então...
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)
;

Espero que seja útil!

Observação 1: Postagem e comentários relevantes do blog
Observação 2: Tópico SO relevante