1

为什么下面的第一个查询在 Firefox SQLite 管理器中有效,而第二个查询无效?为什么使用 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 设置设为真。此外,MySQL 只允许有限深度的递归。

4

1 回答 1

1

不知道为什么第一个触发器在 Firefox SQLite 管理器中起作用。如果触发器导致表插入到自身中,则触发器应该失败,并且最好在它不会编译时失败。我猜这可能是因为 Firefox SQLite 如何使用允许触发器编译的 when 子句编写他们的 DBMS。第二个是非法 SQL。当它执行时,它每次都会插入然后级联,所以你不能允许它。

于 2012-08-08T23:25:05.843 回答