日期:2014-05-16  浏览次数:20924 次

MySQL生产库Insert了2次同样的记录但是主键ID是不一样的问题的分析过程

Email里面收到朋友laopan的求助

laopan:


insert into HudsonResult(JobID,EnvironmentID,FirstSessionID,RerunSessionID,State,Desp,OtherInfo) values 
((select ID from Hudson where Stream='A7510_R52_Integration' and State='N' and pakName='needCompile' and User='jinhaiz'),0,'N','N','N','smoke_test','')
如果相同的记录不存在就执行上面这条insert命令,防止执行是insert两次。
这个语句该怎么写?

能明白不?
现在有个问题就是insert了2次同样的记录但是主键ID是不一样的。



me :
如果是mysql数据库的话:

1 如果你表中有唯一健的话,可以通过这个唯一健来进行赛选的。
2 如果没有唯一健的话,你需要有判断数据是否重复的条件,根据这个条件先select出来,看是否存在,如果不存在就insert,如果存在要么覆盖要么就忽略掉不执行,这个过程需要多条sql语句,最好开启事务来进行控制。


Mysql中有一个replace以及Insert into ..... on duplicate key update 来判断对重复数据进行insert或者update的,但是这是依据主健或者唯一健来判断的。你可以参考下下面这篇文章。



http://blog.csdn.net/mchdba/article/details/8647560



laopan:
1.唯一键怎么筛选?现在的问题是唯一的不同是key不一样,别的列都是一样的。


me :
把表结构发给我,我看看 , 通过执行 命令  show create table HudsonResult;  可以得出表结构。
如果没有唯一健的话,就不能从sql层面去判断数据的唯一性,否则资源消耗太大了。需要从应用角度数据来源角度去验证过滤。



laopan:
mysql> show create table HudsonResult;
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table        | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     &