为什么下面的第一个查询在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设置为true。此外,MySQL只允许有限的递归深度。
答案 0 :(得分:1)
不知道为什么第一个触发器在Firefox SQLite管理器中工作。如果触发器导致表插入自身,则触发器应该失败,并且最好不能编译。我想这可能是因为Firefox SQLite如何使用允许触发器编译的when子句编写DBMS。第二个是非法的SQL。当它执行它只是每次插入然后级联,所以你不能允许它。