2017-12-04 25 views
1

MySQLの一時テーブルにストアドプロシージャを実行することはできますか?私は理論的には、異なるユーザーのために並行して実行できるデータインポート用のシステムを作成しようとしています。あるユーザーが別のユーザーが同じことをしている間に一時テーブルにファイルをインポートする場合、プロシージャで参照されているテーブルが一時テーブルと一致するため、同じ共有プロシージャを両方のユーザーが呼び出すことができますか?いじると更新がテーブルnewdata 一時テーブルにストアドプロシージャを呼び出す

  • ストアドプロシージャに行われnewdata
  • ストアドプロシージャが呼び出された一時テーブルに

    次のようになり、個々のユーザーのためのワークフロー...

    1. データのロードnewdataからライブ/パーマネントテーブルにデータを移動します。

    ...別のユーザーが同じことを行う可能性があります。

  • +0

    はいこれは可能です –

    答えて

    1

    はい、あなたはストアドプロシージャで一時テーブルを参照することができます。

    mysql> create procedure p() select * from t; 
    Query OK, 0 rows affected (0.03 sec) 
    
    mysql> create temporary table t as select 123 union select 456; 
    Query OK, 2 rows affected (0.02 sec) 
    Records: 2 Duplicates: 0 Warnings: 0 
    
    mysql> call p; 
    +-----+ 
    | 123 | 
    +-----+ 
    | 123 | 
    | 456 | 
    +-----+ 
    

    を(MySQLの5.6.31でテスト)

    しかし、最も経験豊富なMySQLのユーザーは、あなたが計画している何を避けるようにしてくださいそれらが複製を使用している場合。その理由は、スレーブが何らかの理由で再起動すると、一時テーブルが削除されるためです。したがって、テンポラリテーブルを参照している後続のUPDATEおよびINSERT...SELECTは、テンポラリテーブルが存在しなくなったためエラーが発生します。レプリケーションストリームのエラーによりレプリケーションが停止します。

    スレーブが突然再起動することは珍しいことですが、アプリが頻繁にテンポラリテーブルを作成すると、スレーブが再起動した時点でテンポラリテーブルが存在する可能性が高くなります。一時テーブルの

    最良の使用は文で一時データとそれらを満たし、その後、唯一の(複製されません)SELECTクエリで一時テーブルを使用することです。

    +0

    ありがとう、ビル。レプリケーションのフロントについての良い考えやアドバイスも...私はそれを考慮していませんでした。 – TravisVOX

    関連する問題