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

   2015-11-05 0
核心提示:这篇文章主要介绍了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://www.lexue001.com/article/47090.htm)。


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能不动尽量不要动。

 
标签: 记录 主键ID
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • mysql sql使用记录
    mysql sql使用记录
    mysql 查询 1: Distinct      有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能去重他的目标字段(
    02-10
  • 如何在MySql中记录SQL日志(例如Sql Server Pro
    SQL server有一个sql profiler可以实时跟踪服务器执行的SQL语句,这在很多时候调试错误非常有用。例如:别人写的复杂代码、生产系统、无调试环境、无原代码... ... 查了一下资料,My SQL可以用下面方法跟踪sql 语句,以下方法以Windows平台为例,linux雷同:
    02-10
  • 查看oracle用户执行的sql语句历史记录 oracle查
    一时失误,删除了PL/SQL窗口数据的历史,然后半个半个星期写的代码全部白费,但是想起来之前执行过,所以可以通过查询历史记录找回。以下为找回代码:平时用得少,保存一下以后查看。 select * from v$sqlarea t where t.PARSING_SCHEMA_NAME in ('用户名')
    02-10
  • Oracle EBS-SQL (INV-2):检查帐户别名发放记录.
    SELECT FU.description                 操作者,         ITM.SEGMENT1               物料编码,         ITM.DESCRIPTION           物料描述,         TXN.TRANSACTION_DATE 交易日期,  
    02-09
  • Mysql 不存在则插入,存在则更新 mysql 存
    1 CREATE DEFINER=`transmate`@`%` PROCEDURE `userLoginCount`(in userName varchar(45))2 BEGIN3 insert into login(username,count) values(userName,1) on duplicate key update count=count+1;4 END开始写了一大堆的代码来实现,原来还有这种方法,惊讶~
    02-09
  • mysql表结构的修改-sql记录 数据库表结构修改记
    1 ALTER TABLE tbl_sms_trackadd COLUMN SENDCONTENT VARCHAR(500) AFTER PLATEFROM_NAME; -- 添加一列 23 ALTER TABLE tbl_sms_track DROP COLUMN SENDCONTENT; -- 删除一列 45 ALTER TABLE tbl_sms_track MODIFY SIGN VARCHAR(400); -- 修改数据类型 67 ALT
    02-09
  • ORACLE查询删除重复记录三种方法
    本文列举了3种删除重复记录的方法,分别是rowid、group by和distinct,小伙伴们可以参考一下。
  • Mysql Binlog快速遍历搜索记录及binlog数据查看
    这篇文章主要介绍了Mysql Binlog快速遍历搜索记录及binlog数据查看的方法的相关资料,需要的朋友可以参考下
    03-20 mysqlbinlog
  • MySQL中distinct语句去查询重复记录及相关的性
    这篇文章主要介绍了MySQL中distinct语句去查询重复记录及相关的性能讨论,文中的观点是在一定情况下避免在最高层查询中使用distinct,需要的朋友可以参考下
  • 使用aggregate在MongoDB中查询重复数据记录的方
    这篇文章主要介绍了使用aggregate在MongoDB中查询重复数据记录的方法的相关资料,需要的朋友可以参考下
点击排行