如果我有一个包含单个事务和数千个INSERT
语句的文件,我可以指望'now'
对于所有INSERT
都是相同的,还是我必须找到另一个办法?也就是说,在一个简化的示例中,给出:
create table things (
fid integer not null primary key,
name character(32) not null default '' unique,
descr character(128) not null,
lastupd date not null default (strftime('%s','now'))
);
begin transaction;
insert into things (name, descr) values ('one', 'foo');
insert into things (name, descr) values ('two', 'bar');
:
:
insert into things (name, descr) values ('last', 'baz');
end transaction;
所有插入的行在lastupd中是否包含相同的值?我猜不是。那么也许将当前时间插入到临时表中,并在所有带有WHERE子句的INSERT中引用它?
因此,在上述“可行”情况不太可能发生的情况下,添加ON CONFLICT
子句会引起另一个问题。可以使用以下方法,但是(显然)不会更新lastupd列:
insert into things (name, descr) values ('last', 'baz')
on conflict (name) do update set
descr = excluded.descr;
尝试:
insert ...
on conflict (name) do update set
descr = excluded.descr,
lastupd = excluded.lastupd;
抱怨没有排除此类列。lastupd。
以下子句有效:
insert ...
on conflict (name) do update set
descr = excluded.descr,
lastupd = strftime('%s','now');
但是肯定开始感觉到“必须有更好的方法”。 也许是某种触发因素?
答案 0 :(得分:0)
一种替代方法是使用:-
begin transaction;
insert into things (name, descr,lastupd) values ('one', 'foo','[Error]');
insert into things (name, descr,lastupd) values ('two', 'bar','[Error]');
:
:
insert into things (name, descr,lastupd) values ('last', 'baz','[Error]');
update things set lastupd = (strftime('%s','now')) WHERE lastupd = '[Error]'; --<<<<<<<<<<
end transaction;
即使用lastupd列的指示符值进行插入(可能将默认值设置为指示符(如另一个问题所示),在这种情况下,只需使用原始的两列进行插入),然后在所有插入之后使用所有插入的时间戳的单个值。
例如:-
create table things (
fid integer not null primary key,
name character(32) not null default '' unique,
descr character(128) not null,
lastupd date not null default (strftime('[Error]'))
);
begin transaction;
insert into things (name, descr) values ('one', 'foo');
insert into things (name, descr) values ('two', 'bar');
insert into things (name, descr) values ('last', 'baz');
update things SET lastupd = (strftime('%s','now')) WHERE lastupd = '[Error]';
end transaction;
结果:-