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

MySQLのトリガーでプリペアドステートメントを使用する代わりに

    簡単に言うと、トリガーで動的SQLを使用することはできません。

    auto_increment値のクエリと、ID列への値の割り当てに混乱しています。 ID列の値を設定する必要がある理由がわかりません。 AUTO_INCREMENTとして定義されている列ではありませんか?データベースが割り当てを処理します。

    また、特に同時挿入が実行されている場合に、クエリが一意の値を返すことが保証されているかどうかも明確ではありません。 (私はテストしていないので、うまくいくかもしれません。)

    しかし、コードは独特です。

    達成しようとしているのは、最後に挿入された行から列の値を取得することであるように見えます。トリガーが定義されているのと同じテーブルのクエリにはいくつかの制限があると思います。 (Oracleには確かにあります。MySQLの方がリベラルかもしれません。)

    そのようなことをする必要がある場合は、次のようなことを試してみます:

     SELECT @prev_hash := t.hash AS prev_hash 
       FROM core_Test t
      ORDER BY t.ID DESC LIMIT 1;
    
     SET NEW.hash = @prev_hash; 
    

    しかし、繰り返しになりますが、これが機能するかどうかはわかりません(テストする必要があります)。単純なケースで機能する場合、同時挿入の場合、拡張挿入の場合など、常に機能することを証明するものではありません。

    ID列のインデックスを使用して逆スキャン操作を実行できるように、クエリを作成しました。インデックスを使用しない場合は、そのクエリを書き直してみます(おそらく、JOINとして、可能な限り最高のパフォーマンスを得るようにします。

     SELECT @prev_hash := t.hash AS prev_hash
       FROM ( SELECT r.ID FROM core_Test r ORDER BY r.ID DESC LIMIT 1 ) s
       JOIN core_Test t
         ON t.ID = s.ID
    

    MySQL5.1リファレンスマニュアルからの抜粋
    E.1ストアドプログラムの制限




    1. 任意の深さのレートを返す再帰的なSELECTクエリ?

    2. インデックスとは何ですか?

    3. SQLSTATE [22007]:無効な日時形式:1366整数値が正しくありません:Laravelの「column_name」

    4. MySQLのJSON_CONTAINS()の例