sql >> データベース >  >> RDS >> Mysql

MySQLでLOADDATAINFILEを使用してnullまたは空の入力をフィルタリングする

    これを行うには、ファイルを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に与えられた正規表現 2行目は、タブ文字の後に1つ以上の文字が続く行と一致します。ニーズに合わせて微調整することをお勧めします。

    編集: もう1つの可能性が私に起こりました。 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. MySQLデータベースの2つの列を更新するにはどうすればよいですか?

    2. SQL結合チュートリアル

    3. PL/pgSQLで使用する変数にクエリ結果を格納する

    4. PostgreSQLの「INSERTにはターゲット列よりも多くの式があります」を修正しました