插入/更新具有相同时间戳的许多行

时间:2019-06-11 18:22:04

标签: sqlite

如果我有一个包含单个事务和数千个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');

但是肯定开始感觉到“必须有更好的方法”。 也许是某种触发因素?

1 个答案:

答案 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;

结果:-

enter image description here