欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-28 15:35:58
email里面收到朋友laopan的求助 laopan:insert into hudsonresult(jobid,environmentid,firstsession...

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的,但是这是依据主健或者唯一健来判断的。你可以参考下下面这篇文章()。


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

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

laopan:

mysql> show create table hudsonresult;
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| table        | create table                                                                                                                                                                                                                                                                                                  
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| hudsonresult | create table `hudsonresult` (
  `jobid` int(32) not null,
  `environmentid` int(32) not null,
  `firstsessionid` varchar(100) default null,
  `rerunsessionid` varchar(100) default null,
  `state` varchar(5) default null,
  `id` int(32) not null auto_increment,
  `desp` varchar(100) default null,
  `execnum` int(32) default null,
  `failnum` int(32) default null,
  `atcstarttime` datetime default null,
  `atcendtime` datetime default null,
  `focnumbefore` int(32) default '0',
  `focnumafter` int(32) default '0',
  `priority` int(32) default '0',
  `focdesp` varchar(5000) default '',
  `otherinfo` varchar(100) default null,
  primary key  (`id`)
) engine=myisam auto_increment=14910 default charset=latin1 |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

现在的问题背景是这样的,网页上insert后,电脑卡了一下,这个时候还没有返回,又点了一下,变成又insert了一次,导致2条记录
内容是一样的,但是主键是不一样的,java你也做过,有没有啥想法,避免这个?

me :
把提交按钮做下处理,很简单的,提交一次后,按纽设置为灰色的,操作者点击不了,只有等待提交处理结果出来继续进行下一步操作。

laopan:

搞定了,呵呵,简单易用哈,考虑多了,谢啦。

总结:可见有很多时候错误数据都是由于应用的bug导致的,清理数据的同时要从根源处理问题,数据层面的sql能不动尽量不要动。