我有一个table,下面是这个table的创建语句
CREATE TABLE `ITEM` (
  `ID` int(11) NOT NULL auto_increment,
  `POSITION` int(11) default NULL,
  `MID` varchar(100) NOT NULL default '',
  `FLAG` int(11) default NULL,
  `USERID` int(11) default NULL,
  PRIMARY KEY  (`ID`),
  KEY `IDX_PLAYLIST_ITEM_FLAG` (`FLAG`),
  KEY `IDX_PLAYLIST_ITEM_MID` (`MID`),
  KEY `IDX_PLAYLIST_ITEM_USERID` (`USERID`)
) 然后我的程序调用下面语句insert
INSERT INTO PLAYLIST_ITEM (FLAG, POSITION, MID) VALUES (1, 0,'some string')run这个程序,log中偶尔会看见下面这个exception,并不是所有的调用都会出现这个exceptioncom.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 2
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:925)但是FLAG并不是key,那位大虾能帮忙分析分析,多谢多谢。

解决方案 »

  1.   

      KEY `IDX_PLAYLIST_ITEM_FLAG` (`FLAG`), 怎么还说不是key?
      

  2.   

    在key 2有重复输入'1',检查一下表记录
      

  3.   

    问题应该处在这上面:
    KEY `IDX_PLAYLIST_ITEM_FLAG` (`FLAG`), 我的推论是:
     FLAG成为索引,MyISAM或者是InnoDB的索引只支持BTREE,
     在添加数据时,数据库需要生成索引键,而FLAG中的数据重复性很大,所以有的时候会产生错误。对于单一性差的数据,添加BTREE索引不但不会增加搜索时的速度,
    反而会降低添加数据时的速度,并且增加对数据的管理负担。
    建议删除这个KEY的索引。而且,Mysql在搜索桌面时,同一个搜索只能参照一个索引,所以最好把几个索引改成多列索引。
      

  4.   

    建议用
    SHOW INDEX  `IDX_PLAYLIST_ITEM_FLAG`;
    看一下你实际的INDEX 类型。.
        [align=center]====  ====
    [/align]
    .
    贴子分数<20:对自已的问题不予重视。
    贴子大量未结:对别人的回答不予尊重。
    .
      

  5.   

    Look at here.
    http://blog.chinaunix.net/u/29134/showart_673456.html
    It can solve your issue.
      

  6.   

    Or Just simply change your statement as follows.INSERT IGNORE INTO PLAYLIST_ITEM (FLAG, POSITION, MID) VALUES (1, 0,'some string')