6

mysql error #1442さて、私はインターネット上で多くの場所を探しました。

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

これはmysqlのバグか、mysqlが提供しない機能であると言う人もいます。

MySQL トリガーは、割り当てられているテーブルを操作できません。他のすべての主要な DBMS はこの機能をサポートしているため、MySQL がこのサポートをすぐに追加することを願っています。

これは、レコードを挿入するときの再帰的な動作が原因であると主張する人もい ます。mysql は何らかのロック処理を行っています。挿入した同じテーブルの行を挿入/更新/削除することはできません..トリガーが何度も呼び出されるため..再帰に終わる

挿入/更新中に、関連するテーブルのすべてのフィールドを含む NEW オブジェクトにアクセスできます。新しいオブジェクトで変更するフィールドを挿入/更新および編集する前に実行すると、呼び出しステートメントの一部になり、個別に実行されません (再帰を排除します)。

なぜこれが再帰的なのか理解できません。私は2つのテーブルがtable1ありtable2、SQLクエリを次のように実行する場合があります

update table1 set avail = 0 where id in (select id from table2 where duration < now() - interval 2 hour);

今、私はafter update triggerオンにtable1なっています

CREATE TRIGGER trig_table1 AFTER UPDATE ON table1
FOR EACH ROW begin
if old.avail=1 and new.avail=0 then
delete from table2 where id=new.id;
end if;

更新クエリを実行すると、1442 エラーが発生します。この場合、何が再帰的ですか?

is this error a lack of feature in mysql?
OR
does this have to do with how mysql executes queries?
OR
is there something logically wrong with executing such queries?
4

1 に答える 1

4

更新時にテーブルを参照することはできません。

/* my sql does not support this */
UPDATE tableName WHERE 1 = (SELECT 1 FROM tableName)

MySQL ドキュメントから:

トリガーは、独自のテーブル内の古いデータと新しいデータの両方にアクセスできます。トリガーは他のテーブルにも影響を与える可能性がありますが、関数またはトリガーを呼び出したステートメントによって (読み取りまたは書き込みのために) 既に使用されているテーブルを変更することは許可されていません。(MySQL 5.0.10 より前では、トリガーは他のテーブルを変更できません。)
于 2011-07-20T02:50:30.613 に答える