在 SQLite 中插入或更新

Posted

技术标签:

【中文标题】在 SQLite 中插入或更新【英文标题】:Insert or update in SQLite 【发布时间】:2017-03-01 17:14:27 【问题描述】:

我有一个包含 4 列的简单表格(ID(自动生成)、ip、日期、访问次数)

例如:

1,'10.10.0.10', '2017-03-01',1

我正在寻找 SQLite 中的插入或更新,它需要检查 ip 和日期列,如果存在更新访问 +1 否则插入新行。

我可以发出 2 个 sql,但想将其保留在 1 个 sql 中。

这在 SQLite 中可行吗?

【问题讨论】:

【参考方案1】:

如果您为 IP 和日期生成唯一索引,您可以使用 insert or replace 语句分两步实现:

    尝试查询当前访问次数为IP和日期;如果未找到记录,则设置为 0。

    对 IP 和日期执行 insert or replace(我在此示例中使用命名参数;您需要将它们绑定到适当的值):

    insert or replace into Visits (id, ip, date, visits)
    values (NULL, :ip, :date, :visits + 1);
    

您可以添加一个表约束来创建唯一索引,如下例所示,或者您使用单独的create unique index 语句:

create table Visits (..., unique (ip, date));

附录:甚至可以在一次查询中更新访问次数:

insert or replace into Visits (id, ip, date, visits)
    select NULL, :ip, :date, ifnull(max(visits), 0) + 1
    from Visits
    where ip = :ip and date = :date;

【讨论】:

以上是关于在 SQLite 中插入或更新的主要内容,如果未能解决你的问题,请参考以下文章

SQLite UPSERT / 更新或插入

如何使用 PHP(和 HTML)从 SQLite 中选择、插入、更新和删除数据

向 SQLite 后端添加内容时更新表

针对 20,000 多次更新优化 Sqlite3

SQLite 或 FMDB 无法找到包含某些字符的行

我可以在sqlite中插入触发器之前更新New in吗?