触发器创建期间的SQL语法错误:何时与何处

时间:2012-08-08 23:08:10

标签: sql sqlite

为什么下面的第一个查询在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只允许有限的递归深度。

1 个答案:

答案 0 :(得分:1)

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