2011-07-21 41 views
7

我有一个代码有两个mysql查询。
DELETE FROM my_table WHERE user_id=some_number
INSERT INTO my_table (user_id, ...) VALUES(some_number, ...)由于“重复项”删除失败后mysql插入

领域user_id是唯一的。

在极少数情况下插入失败,声称发生了重复条目。我的第一本能让我相信DELETE没有完成,现在插入试图插入,我得到一个重复的条目。这可能吗?我怎样才能避免这种情况?可以想象一个不同的解释吗?

更新:我删除的原因是因为我想删除所有不是我第一次更新/插入的数据。另外,我认为重要的是说大部分数据保持不变。

+0

是否有可能是两个进程同时为同一个ID运行这两个语句的竞态条件? –

+0

你可能有兴趣在REPLACE和INSERT ... ON DUPLICATE KEY UPDATE语句 –

+1

DELETE失败可能吗?执行后是否有一些检查? – ascanio

回答

1

您可以随时在DELETE后尝试COMMIT以确保其完成。

+0

我只需要添加另一个查询“COMMIT”来尝试?如果其他查询速度缓慢,它是否也会等待它们,或者我可以等待删除完成吗? – Noam

+0

是的,你可以自己做提交。从你所发布的代码中不应该真的需要,但它会迫使完成第一个语句的问题。 –

2

使用UPDATE语句来代替:

UPDATE my_table 
SET my_column = my_value 
WHERE user_id = some_number 
+0

你可以(这是'INSERT INTO'语法中的一个MySQL变种)。看这里; http://dev.mysql.com/doc/refman/5.1/en/insert.html –

+0

@ypercube你是对的。 –

+0

更新不会删除我希望替换的旧数据。对? – Noam

2
SET AUTOCOMMIT=0;  
START TRANSACTION;  
DELETE FROM my_table WHERE user_id=some_number;  
INSERT INTO my_table (user_id, ...) VALUES(some_number, ...); 
commit; 
1

你为什么DELETE然后INSERT相同user_id并不仅仅是UPDATE行?

+0

因为我想删除所有我第一次不更新/插入的数据,而我不更新具有相同数据的所有行。每个新行/更新的行都会有不同的数据。 – Noam

-2

发生这种情况是因为查询被视为两个单独的事务,所以不能保证执行的顺序。您所描述的效果是因为插入在删除之前进行处理。您应该更改查询逻辑或在一个事务中执行两个查询。