删除行时不应该删除

时间:2015-03-12 21:13:14

标签: sqlite

如果我在sqlite 3.8.8.3中执行以下脚本

PRAGMA foreign_keys=on;

create table A (
k integer primary key not null
);

create table B (
value text primary key,
k integer references A(k) on delete cascade
);

create table C (
k integer primary key,
value text
);

create trigger C_A before insert on C
begin
insert or ignore into A values(NEW.k);
end;

insert into A values (5);
select * from A;

insert into B values ('asdf', 5);
select * from B;

insert or ignore into A values(5); --just calling this works right
select * from B;

insert or ignore into C values (5, 'qwer'); --this works too
select * from B;  

insert or replace into C values (5, 'qwer'); --this doesn't work
select * from B; --doesn't print anything

我得到了输出

5
asdf|5
asdf|5
asdf|5

当我期待输出

5
asdf|5
asdf|5
asdf|5
asdf|5

好像是" or replace"传播到触发器中,替换A中的行,并删除B中的行。

这是预期的行为吗?我误解了应该做些什么吗?

1 个答案:

答案 0 :(得分:2)

这是documented

  

ON CONFLICT子句可以指定为触发器正文中UPDATEINSERT操作的一部分。但是,如果将ON CONFLICT子句指定为导致触发器触发的语句的一部分,则使用外部语句的冲突处理策略。