代码之家  ›  专栏  ›  技术社区  ›  Alix Axel

sqlite insert-在重复密钥更新时(upsert)

  •  84
  • Alix Axel  · 技术社区  · 16 年前

    MySQL有如下特点:

    INSERT INTO visits (ip, hits)
    VALUES ('127.0.0.1', 1)
    ON DUPLICATE KEY UPDATE hits = hits + 1;
    

    据我所知,这个特性在sqlite中并不存在,我想知道的是是否有任何方法可以在不执行两个查询的情况下达到相同的效果。此外,如果这不可能,您希望:

    1. 选择+(插入或更新)
    2. 更新(+插入 如果更新失败 )
    5 回复  |  直到 7 年前
        1
  •  6
  •   szmate1618    7 年前

    Since 3.24.0 SQLite also supports upsert ,所以现在您可以简单地编写以下内容

    INSERT INTO visits (ip, hits)
    VALUES ('127.0.0.1', 1)
    ON CONFLICT(ip) DO UPDATE SET hits = hits + 1;
    
        2
  •  111
  •   Community Mohan Dere    9 年前
    INSERT OR IGNORE INTO visits VALUES ($ip, 0);
    UPDATE visits SET hits = hits + 1 WHERE ip LIKE $ip;
    

    这要求“IP”列具有唯一(或主键)约束。


    编辑:另一个伟大的解决方案: https://stackoverflow.com/a/4330694/89771 .

        3
  •  17
  •   codeholic    16 年前

    我更喜欢 UPDATE (+ INSERT if UPDATE fails) . 更少的代码=更少的错误。

        4
  •  5
  •   Jacob Thomason    13 年前

    当前的答案只适用于sqlite或mysql(取决于您是否使用)。所以,如果您想要跨DBMS的兼容性,下面的操作可以…

    REPLACE INTO `visits` (ip, value) VALUES ($ip, 0);
    
        5
  •  -3
  •   Xeoncross    14 年前

    您应该为此使用memcached,因为它是存储单个值(访问次数)的单个键(IP地址)。您可以使用原子增量函数来确保不存在“竞争”条件。

    它比mysql快,并且节省了负载,因此mysql可以专注于其他事情。