即使没有添加记录,SQLite也会增加auto-inc值

时间:2015-06-13 06:03:43

标签: sqlite

我相信,如果记录插入尝试失败/被忽略,InnoDB中有一种方法可以阻止自动增量值增加:

  

innodb_autoinc_lock_mode

但是,每次有人连接到我的服务器时,我都会在SQLite3上使用此查询:

  

" INSERT或IGNORE IN IPList(IP)VALUES(" + string(ip)+"); "

不幸的是,如果IP已经在表中,则自动增量值无论如何都会增加。如果很多人连接到我的服务器,那么这个价值将非常高。

如何阻止它在SQLite3中执行此操作?

2 个答案:

答案 0 :(得分:1)

documentation说:

  

请注意,“单调增加”并不意味着ROWID总是增加一个。一个是通常的增量。但是,如果插入因(例如)唯一性约束而失败,则失败的插入尝试的ROWID可能不会在后续插入中重用,从而导致ROWID序列中出现间隙。 AUTOINCREMENT保证自动选择的ROWID会增加,但不会保证它们是连续的。

要确保自动增量值是连续的,请从表定义中删除AUTOINCREMENT关键字并使用普通的INTEGER PRIMARY KEY:

  

AUTOINCREMENT关键字会产生额外的CPU,内存,磁盘空间和磁盘I / O开销,如果不是严格需要,应该避免使用。通常不需要它。

     

在INSERT上,如果未明确给出ROWID或INTEGER PRIMARY KEY列的值,则它将自动填充未使用的整数,通常比当前使用的最大ROWID多一个。无论是否使用AUTOINCREMENT关键字,都是如此。

答案 1 :(得分:0)

好吧,我不认为有这样做的设置,我只是通过在尝试插入之前检查该行是否存在来修复它。

显然,如果插入失败,无论如何,自动增量值都会上​​升。所以如果它已经存在,我就不要调用INSERT。