我相信,如果记录插入尝试失败/被忽略,InnoDB中有一种方法可以阻止自动增量值增加:
innodb_autoinc_lock_mode
但是,每次有人连接到我的服务器时,我都会在SQLite3上使用此查询:
" INSERT或IGNORE IN IPList(IP)VALUES(" + string(ip)+"); "
不幸的是,如果IP已经在表中,则自动增量值无论如何都会增加。如果很多人连接到我的服务器,那么这个价值将非常高。
如何阻止它在SQLite3中执行此操作?
答案 0 :(得分:1)
请注意,“单调增加”并不意味着ROWID总是增加一个。一个是通常的增量。但是,如果插入因(例如)唯一性约束而失败,则失败的插入尝试的ROWID可能不会在后续插入中重用,从而导致ROWID序列中出现间隙。 AUTOINCREMENT保证自动选择的ROWID会增加,但不会保证它们是连续的。
要确保自动增量值是连续的,请从表定义中删除AUTOINCREMENT关键字并使用普通的INTEGER PRIMARY KEY:
AUTOINCREMENT关键字会产生额外的CPU,内存,磁盘空间和磁盘I / O开销,如果不是严格需要,应该避免使用。通常不需要它。
在INSERT上,如果未明确给出ROWID或INTEGER PRIMARY KEY列的值,则它将自动填充未使用的整数,通常比当前使用的最大ROWID多一个。无论是否使用AUTOINCREMENT关键字,都是如此。
答案 1 :(得分:0)
好吧,我不认为有这样做的设置,我只是通过在尝试插入之前检查该行是否存在来修复它。
显然,如果插入失败,无论如何,自动增量值都会上升。所以如果它已经存在,我就不要调用INSERT。