1

列Cが特定の値に等しい場合に重複を防ぐこのコードがあります

DELIMITER $$

CREATE TRIGGER special_unique_test BEFORE INSERT ON myTable 
    FOR EACH ROW BEGIN
       IF NEW.C = 'x' AND EXISTS (
          SELECT * FROM myTable WHERE A = NEW.A AND B = NEW.B AND C = 'x'
       )THEN

          UPDATE myTable SET D = D + 1 WHERE A = NEW.A AND B = NEW.B AND C = 'x';

       END IF;
    END$$

DELIMITER ;

updateステートメントが実行されないことを除いて、すべてが機能します。

追加した

PhpMyAdminでこれを試したところ、次のエラーが発生しました。

1442-このストアド関数/トリガーを呼び出したステートメントによって既に使用されているため、ストアド関数/トリガーのテーブル'myTable'を更新できません。

D列用に別のテーブルを作成することでこれを回避できますが、同じテーブルに配置すると便利です。

追加の質問:mysqliを使用してWebサイトから何かを挿入したときに、このエラーを表示するにはどうすればよいですか?

4

1 に答える 1

3

ストアドプログラムの制限に記載されているとおり:

ストアド関数またはトリガーは、関数またはトリガーを呼び出したステートメントによって(読み取りまたは書き込みのために)すでに使用されているテーブルを変更することはできません。

D新しく挿入された行のみをインクリメントする場合は、必要なだけですSET NEW.D = NEW.D + 1;D「衝突する」レコードごとにインクリメントする場合はD、他の(関連する)テーブルに格納する必要があります。たとえば、列を別のテーブルに格納し、FKをに戻すことができます。D(A, B, C)myTable

ただし、全体的な目標を達成するためのより良い方法があるかどうか疑問に思わざるを得ません。このトリガーで対処しようとしているビジネス上の問題は正確には何ですか。XY問題に注意してください。

于 2012-10-14T22:26:15.980 に答える