1

以下の最初のクエリは Firefox SQLite マネージャーで機能するのに、2 番目のクエリは機能しないのはなぜですか? SQLite、MySQL、PostGreSQLなどを使用したSQL Fiddleで両方が失敗するのはなぜですか?

create trigger symmetric_insertion
after insert on T
for each row
when not exists (select * from T where T.A = New.B and T.B = New.A)
begin
  insert into T values (New.B, New.A);
end;

.

create trigger symmetric_insertion
after insert on T
for each row
begin
  insert into T values (New.B, New.A)
  where not exists (select * from T where T.A = New.B and T.B = New.A);
end;

編集: recursive_triggers 設定を true にしていないため、無限ループは作成されません。さらに、MySQL では有限の深さの再帰しか許可されていません。

4

1 に答える 1

1

Firefox SQLite マネージャーで最初のトリガーが機能する理由がわかりません。テーブルがそれ自体に挿入される場合、トリガーは失敗する必要があり、コンパイルされない場合が最適です。おそらく、Firefox SQLite がトリガーをコンパイルできるようにする when 句を使用して DBMS を記述したことが原因であると思います。2 つ目は、不正な SQL です。実行すると、毎回挿入されてからカスケードされるため、許可できません。

于 2012-08-08T23:25:05.843 に答える