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

bashからのMySQL関連テーブルの一括挿入

    あなたの質問には、相反するさまざまな要件があります。この答えは、その「ロックを維持する」側面に焦点を当てています。

    操作全体でテーブルロックを維持するには、SQLサーバーへの単一の接続を維持する必要があります。 1つの方法は、すべてを複数行の複数コマンド入力としてmysqlコマンドラインクライアントの1回の呼び出しに渡すことです。基本的にこのように:

    { echo "LOCK TABLES Table1 WRITE"
      for i in "${infiles[@]}"; do
        echo "LOAD DATA LOCAL INFILE '${i}'"
      done
    } | mysql
    

    これは、ロックが維持されている間、データベースから(最大識別子などの)質問をせずに必要なすべてのステートメントを生成できる限り機能します。

    読み取り操作(最大値の要求など)と書き込み操作(一部のファイルのコンテンツのロードなど)を組み合わせるには、サーバーとの双方向通信が必要になります。 bashでこれを達成するのは非常に難しいので、反対することをお勧めします。質問する必要がない場合でも、bashパイプによって提供される単方向接続は危険の原因です。mysql側で問題が発生した場合、bashは気付かず、とにかく次のコマンドを発行します。一貫性のないデータをコミットしてしまう可能性があります。

    これらの理由から、あなたが言及したPerlまたはPyhonオプションのように、mysqlバインディングが利用可能なスクリプト言語をお勧めします。これらの言語でCVSファイルを読み取るのは簡単なので、1つのスクリプトで次のすべてを実行できます。

    1. テーブルをロックする
    2. トランザクションを開始
    3. 入力csvファイルを読み取る
    4. 最大IDなどの質問をする
    5. テーブルのレイアウトに一致するように入力データを調整します
    6. テーブルにデータを挿入
    7. エラーが発生しなかった場合は、トランザクションをコミットします



    1. PHP / SQL、列として値を取得する場所を選択するだけ

    2. グループごとに2行のMYSQLGroupby Column

    3. C#コードを使用してMySqlデータベースにDateTimeを挿入する方法

    4. NodeJSMySQLへの同時リクエストを処理する方法