一位同事刚刚让我意识到一个非常奇怪的MySQL行为。为什么在失败的插入时MySQL自动增量会增加?
假设您有一个带有auto_increment字段和另一个字段设置为唯一的表(例如用户名字段)。当试图插入一个已经在表中的用户名的行时,插入失败,如预期的那样。然而,auto_increment值会增加,这是因为在多次失败尝试后插入有效的新条目时可以看到。
例如,当我们的最后一个条目看起来像这样...
ID: 10
Username: myname
......我们试图用我们将创建一个新的行就像我们的下一个插入相同的用户名值五个新项目所以:
ID: 16
Username: mynewname
虽然这不是它本身似乎是一个非常愚蠢的攻击向量与失败的插入请求淹没它杀了表的一个大问题,因为MySQL参考手册的状态:
“如果该值大于可以存储在指定整数类型中的最大整数,则自动递增机制的行为未定义。”
这是预期的行为吗?
你的攻击向量似乎非的问题。如果你可以用失败的插入请求来洪水它,你不能同样用非失败的请求来洪水吗? – 2010-05-07 10:52:22
您可以携带重现**代码**而不是手动解释吗? – 2010-05-07 10:55:59
@martin smith:虽然这是真的,但我认为突然涌现的新用户会比auto_increment的沉默增加更明显,如果没有检查的话,它可能会很好地落在旁边。 – Sorcy 2010-05-07 12:40:40