【问题标题】:SQLite auto increment on INSERT and UPDATESQLite 在 INSERT 和 UPDATE 上自动递增
【发布时间】:2018-02-24 20:16:11
【问题描述】:

我有一个 SQLite 数据库,我需要用不断增加的计数器标记任何新记录和任何修改的记录。我必须避免竞争条件

这是我目前正在使用的两个查询:

插入:

INSERT INTO customer (id, name, counter) VALUES (myId, "blablabla", ((SELECT MAX(counter) FROM customer) + 1))

更新:

UPDATE customer SET name = "blablabla", counter = (SELECT MAX(counter) FROM customer) + 1 WHERE id = myId

这样安全吗?我在 Cordova 移动应用上使用 SQLite

如果没有,最好的方法是什么?我可以将counter 声明为AUTO_INCREMENT 并且只有这两个查询吗?

插入:

INSERT INTO customer (id, name) VALUES (myId, "blablabla")

更新:

UPDATE customer SET name = "blablabla", counter = (SELECT MAX(counter) FROM customer) + 1 WHERE id = myId

【问题讨论】:

  • SQLite 和 MySQL 是两个完全不同的东西。
  • 让我们去 SQLite 吧...顺便说一句太棒了 -> github.com/ConsenSys/dapp-store-contracts/blob/master/contracts/…
  • SQLite 是嵌入应用程序的不错选择,因为它不需要服务器进程。
  • 好的,但是我在做什么正确吗?看问题
  • SELECT MAX(x) 不会不受竞争条件的影响。你为什么不做一个序列生成器?

标签: sql database sqlite cordova


【解决方案1】:

制作一个只包含计数器值的 TABLE,每次添加新记录或更新时都会调用它,并将其增加 1 并将该值写回 TABLE 并更新我不确定是什么当你删除一条记录时你会这样做,但与上面相同,只是将计数器值减少 1

如果你不介意,你能告诉我们为什么记录需要有一个 ID 和一个伪 ID >

【讨论】:

  • 我解决了删除问题,购买将删除转换为更新。基本上,我并没有实际删除一条记录,而是更新了一个“已删除”字段。每个“选择”查询都选择 ANDing with deleted = 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
相关资源
最近更新 更多