2012-04-14 127 views
1

我有一个系统,涉及到一个表中插入一行的ajax发布请求。似乎有时ajax调用会被调用两次,这意味着相同的数据会在两个相邻的行中插入两次。MYSQL避免插入同一行两次

我打算首先添加一个查询来尝试并选择具有相同数据的行,然后如果行数= 0添加它。有没有更好的方法避免必须做两个查询?

+0

这已先前所讨论的,参见http://stackoverflow.com/questions/1361340/how-to-insert-if-not-exists-in-mysql – cfedermann 2012-04-14 14:37:40

+0

考虑另一种方法,解决问题的根源在导致AJAX调用的页面上发生两次,而不是编写防御性SQL查询。网页上的“IsDirty”标志也许? – 2012-04-14 14:37:59

+2

您的表没有主键或其他唯一约束,以确保您的数据库中没有重复的数据?你应该。而ID列是不够的;它很方便并且自动生成,但是您应该有其他一些独特的属性组合。然后尝试插入重复数据失败。必须有一种方法可以告诉你插入'同一行'两次;否则,你不可能问这个问题。 – 2012-04-14 15:00:14

回答

3

您可以在插入语句中使用INSERT IGNORE INTO语法或INSERT ... ON DUPLICATE KEY UPDATE。

如果使用INSERT IGNORE,那么如果该行导致重复键,则该行实际上不会被插入。但该声明不会产生错误。它会生成警告。

INSERT IGNORE INTO mytable 
    (primaryKey, field1, field2) 
VALUES 
    ('abc', 1, 2); 
0

我想说的是,处理这个问题的最好方法是在应用程序中使用一个临时令牌(它可以作为一个CSRF令牌来使用,无论如何你可能需要这个令牌)。

如果令牌与操作一起发送,则令牌过期,因此不能重复该令牌。