在表pm_original_materials上创建触发器:

脚本一:

CREATE TRIGGER tri_pm_mat_cost_i
AFTER UPDATE ON pm_original_materials
FOR EACH ROW
BEGIN  IF NEW.FLAG_FIOW_STAGE='4' THENINSERT INTO pm_mat_cost(ORI_MAT_ID,PROJECT_ID,NAME,SPECIFICATIONS,BRAND,UNIT,NUMBER_OF_AUDIT,AUDIT_UNIT,REMARK) SELECT ID AS ORI_MAT_ID,PROJECT_ID,MAT_NAME AS NAME,SPECIFICATIONS,BRAND,UNIT,AUDIT_OF_NUMBER AS NUMBER_OF_AUDIT,AUDIT_OF_PRICE AS AUDIT_UNIT,REMARKS AS REMARK FROM pm_original_materials;END IF;
END

脚本二:

CREATE TRIGGER tri_pm_mat_cost_i
AFTER INSERT ON pm_original_materials
FOR EACH ROW
BEGIN  DECLARE ori_mat_id int(10);SET ori_mat_id=(SELECT MAX(ID) AS ori_mat_id FROM pm_original_materials);IF NEW.FLAG_CHANGE='1' THENINSERT INTO pm_mat_cost(ORI_MAT_ID,PROJECT_ID,NAME,SPECIFICATIONS,BRAND,UNIT,NUMBER_OF_AUDIT,AUDIT_UNIT,REMARK)VALUES(ori_mat_id,NEW.PROJECT_ID,NEW.MAT_NAME,NEW.SPECIFICATIONS,NEW.BRAND,NEW.UNIT,NEW.AUDIT_OF_NUMBER,NEW.AUDIT_OF_PRICE,NEW.REMARKS);END IF;
END

创建触发器后执行insert语句向表pm_original_materials中插入数据时出现如下错误:[Err] 1062 - Duplicate entry '111' for key 'PRIMARY'

很明显是主键未设置自增长所致,检查发现表pm_original_materials的主键是自增长,同时执行insert语句后虽出现以上错误,但是pm_original_materials表中已插入数据,根据触发器脚本不难推测是脚本中的表pm_mat_cost中未设置主键自增长。

类似问题列举:

更新了表结构后,遇到了这样的问题:

mysql> INSERT INTO `sg_medal_action`(`action_name`,`action_code`,`status`) VALUES ('121212','testCode',2);

  ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY'

  问题重现:

  修改前,表的结构如下:

mysql> show createtable sg_medal_action\G

  *************************** 1. row ***************************

         Table: sg_medal_action

  Create Table: CREATE TABLE `sg_medal_action` (

 `action_id` int(10)unsigned NOT NULL,

   `action_code` char(20) NOT NULL,

   `action_name` varchar(80) NOT NULL,

 `status` tinyint(4)unsigned DEFAULT '1',

   PRIMARY KEY (`action_id`,`action_code`)

  ) ENGINE=InnoDB DEFAULT CHARSET=utf8

  1 row in set (0.00 sec)

  

  表的状态信息如下:

  mysql> show table status like 'sg_medal_action'\G

  *************************** 1. row ***************************

       Name:sg_medal_action

           Engine: InnoDB

          Version: 10

       Row_format: Compact

             Rows: 7

   Avg_row_length: 2340

      Data_length: 16384

  Max_data_length: 0

     Index_length: 0

        Data_free: 0

  Auto_increment: NULL

      Create_time: 2011-11-03 16:36:12

      Update_time: NULL

       Check_time: NULL

        Collation: utf8_general_ci

         Checksum: NULL

   Create_options:

     Comment:

  1 row in set (0.00 sec)

  表里面的内容:

  mysql> select * from sg_medal_action;

  +-----------+---------------+--------------------+--------+

  | action_id | action_code   | action_name       | status |

  +-----------+---------------+--------------------+--------+

  |         1 | buyAddr       | 购买线索数量      |      1 |

  |         2 | fans         | 粉丝数             |      1 |

  |         3 | header       | 上传头像           |      1 |

  |         4 | login        | 登录               |     1 |

  |         5 | mark         | 锚点数             |      1 |

  |         6 | showGoods     | 晒货数量          |      1 |

  |         7 | showGoodsLove | 晒货喜欢数        |      1 |

  +-----------+---------------+--------------------+--------+

  7 rows in set (0.00 sec)

  修改表结构语句如下:

  alter table sg_medal_action drop primary key;

  alter table sg_medal_action add primary key(action_id);

 

  执行完以上操作后,表结构、表状态信息分别如下:

  mysql> show create table sg_medal_action\G

  *************************** 1. row ***************************

    Table: sg_medal_action

  Create Table: CREATE TABLE `sg_medal_action` (

    `action_id` int(10) unsigned NOT NULL,

    `action_code` char(20) NOT NULL,

    `action_name` varchar(80) NOT NULL,

    `status` tinyint(4) unsigned DEFAULT '1',

    PRIMARY KEY (`action_id`)

  ) ENGINE=InnoDB DEFAULT CHARSET=utf8

  1 row in set (0.00 sec)

  mysql> show table status like 'sg_medal_action'\G

  *************************** 1. row ***************************

        Name: sg_medal_action

           Engine: InnoDB

          Version: 10

       Row_format: Compact

             Rows: 7

   Avg_row_length: 2340

      Data_length: 16384

  Max_data_length: 0

     Index_length: 0

        Data_free: 0

  Auto_increment: NULL

  Create_time:2011-11-03 16:42:45

      Update_time: NULL

       Check_time: NULL

        Collation: utf8_general_ci

         Checksum: NULL

   Create_options:

          Comment:

  1 row in set (0.00 sec)

  mysql>

  执行 insert 操作,如下:

  mysql> INSERT INTO `sg_medal_action`(`action_name`,`action_code`,`status`) VALUES ('121212','testCode',2);

  Query OK, 1 row affected, 1 warning (0.00 sec)

  插入操作执行成功,查看表中记录情况如下:

  mysql> select * from sg_medal_action;

  +-----------+---------------+--------------------+--------+

  | action_id | action_code   | action_name       | status |

  +-----------+---------------+--------------------+--------+

  |         0 | testCode      |121212             |      2 |

  |         1 | buyAddr       | 购买线索数量      |      1 |

  |         2 | fans         | 粉丝数             |      1 |

  |         3 | header       | 上传头像           |      1 |

  |         4 | login        | 登录               |     1 |

  |         5 | mark         | 锚点数             |      1 |

  |         6 | showGoods     | 晒货数量          |      1 |

  |         7 | showGoodsLove | 晒货喜欢数        |      1 |

  +-----------+---------------+--------------------+--------+

  8 rows in set (0.00 sec)

  再执行一次插入操作,报错如下:

  

  mysql> INSERT INTO `sg_medal_action`(`action_name`,`action_code`,`status`) VALUES ('345','Code',2);

  ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY'

  

  这说明每次往表中插入记录的PRIMARY值均为0。

  

  解决问题思路:

  1、老的表结构,使用的复合索引——“PRIMARY KEY (`action_id`,`action_code`)”,没有指定auto_increment 的值;

  2、删除原来主键,重新创建新主键时(alter table sg_medal_action add primary key(action_id);

),也未指定 auto_increment的值,所以在创建了新主键后,再看表 sg_medal_action 的状态时, Auto_increment 一栏的值仍为NULL;

  3、mysql 不支持 “alter table sg_medal_action add auto_increment primary key(action_id);”这样的语句,请详看alter 的语法 http://dev.mysql.com/doc/refman/5.0/en/alter-table.html ;

  4、解决问题

  mysql> alter table sg_medal_action modify column action_id intunsigned auto_increment;

      Query OK, 7 rows affected (0.06 sec)

      Records: 7  Duplicates: 0  Warnings: 0

  

  执行了此操作后,再查看 sg_medal_action 表结构及状态信息,如下:

  mysql> show create table sg_medal_action\G

  *************************** 1. row ***************************

    Table: sg_medal_action

  Create Table: CREATE TABLE `sg_medal_action` (

    `action_id` int(10) unsigned NOT NULL AUTO_INCREMENT,

    `action_code` char(20) NOT NULL,

    `action_name` varchar(80) NOT NULL,

    `status` tinyint(4) unsigned DEFAULT '1',

    PRIMARY KEY (`action_id`)

  ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8

  1 row in set (0.00 sec)

  

  mysql> show table status like 'sg_medal_action'\G

  *************************** 1. row ***************************

        Name: sg_medal_action

           Engine: InnoDB

          Version: 10

  Row_format: Compact

    Rows: 8

   Avg_row_length: 2048

  Data_length:16384

  Max_data_length: 0

     Index_length: 0

   Data_free: 0

  Auto_increment: 8

  Create_time:2011-11-03 16:25:58

      Update_time: NULL

       Check_time: NULL

   Collation: utf8_general_ci

         Checksum: NULL

   Create_options:

     Comment:

  1 row in set (0.00 sec)

  再执行insert操作,如下:

  mysql> INSERT INTO `sg_medal_action`(`action_name`,`action_code`,`status`) VALUES ('121212','testCode',2);

  Query OK, 1 row affected (0.00 sec)

  

  查询其结果:

  mysql> select * from sg_medal_action;

  +-----------+---------------+--------------------+--------+

  | action_id | action_code   | action_name       | status |

  +-----------+---------------+--------------------+--------+

  |         1 | buyAddr       | 购买线索数量      |      1 |

  |         2 | fans         | 粉丝数             |      1 |

  |         3 | header       | 上传头像           |      1 |

  |         4 | login        | 登录               |     1 |

  |         5 | mark         | 锚点数             |      1 |

  |         6 | showGoods     | 晒货数量          |      1 |

  |         7 | showGoodsLove | 晒货喜欢数        |      1 |

  |         8 | testCode      |121212             |      2 |

  +-----------+---------------+--------------------+--------+

  8 rows in set (0.00 sec)

  再插入一行:

  mysql> INSERT INTO `sg_medal_action`(`action_name`,`action_code`,`status`) VALUES ('345','Code',2);

  Query OK, 1 row affected (0.01 sec)

  查询结果:

  mysql> select * from sg_medal_action;

  +-----------+---------------+--------------------+--------+

  | action_id | action_code   | action_name       | status |

  +-----------+---------------+--------------------+--------+

  |         1 | buyAddr       | 购买线索数量      |      1 |

  |         2 | fans         | 粉丝数             |      1 |

  |         3 | header       | 上传头像           |      1 |

  |         4 | login        | 登录               |     1 |

  |         5 | mark         | 锚点数             |      1 |

  |         6 | showGoods     | 晒货数量          |      1 |

  |         7 | showGoodsLove | 晒货喜欢数        |      1 |

  |         8 | testCode      |121212             |      2 |

  |         9 | Code         | 345                |     2 |

  +-----------+---------------+--------------------+--------+

  9 rows in set (0.00 sec)

  OK,问题处理到此结束。

  总结下:

    auto_increment 与 primary key 如果不一起存在,则做 insert 操作时,必须自己指定 primary key 列的值;

    小测试如下:

    mysql> create table dd (i int primary key,b char(10));

    Query OK, 0 rows affected (0.01 sec)

    mysql> show create table dd\G

    *************************** 1. row ***************************

           Table: dd

    Create Table: CREATE TABLE `dd` (

      `i` int(11) NOT NULL,

      `b` char(10) DEFAULT NULL,

      PRIMARY KEY (`i`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    1 row in set (0.00 sec)

 

    mysql> insert into dd(b) values('dkf');

    Query OK, 1 row affected, 1 warning (0.00 sec)

 

    mysql> select * from dd;

    +---+------+

    | i | b    |

    +---+------+

    | 0 | dkf  |

    +---+------+

    1 row in set (0.00 sec)

    mysql> insert into dd(b) values('lll');

    ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY'

    mysql> select * from dd;

    +---+------+

    | i | b    |

    +---+------+

    | 0 | dkf  |

    +---+------+

    1 row in set (0.00 sec)

  

    mysql> insert into dd values(1,'lll');

    Query OK, 1 row affected (0.01 sec)

    mysql> select * from dd;

    +---+------+

    | i | b    |

    +---+------+

    | 0 | dkf  |

    | 1 | lll  |

    +---+------+

    2 rows in set (0.00 sec)

    mysql> insert into dd(b) values('lll');

    ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY'

另外,请参阅下InnoDB引擎下update操作对atuo_increment影响的文章 http://bugs.mysql.com/bug.php?id=38839

  参阅:http://www.phwinfo.com/forum/comp-databases-mysql/317343-error-1062-23000-duplicate-entry-0-key-1-a.html

[Err] 1062 - Duplicate entry '111' for key 'PRIMARY'相关推荐

  1. 【数据库-MySql】[Err] 1062 - Duplicate entry '1-1' for key 'PRIMARY'

    背景 在Mysql转存过程中使用以下SQL语句,出现Err 1062的报错. INSERT INTO dbbackup.tb1 SELECT* FROMtb1 主键或联合主键对应的数据已存在. [Er ...

  2. mysql-pymysql.err.IntegrityError:(1062, “Duplicate entry ‘2147483647‘ for key ‘PRIMARY‘)

    项目场景: mysql插入数据时遇到的bug. 问题描述: pymysql.err.IntegrityError:(1062, "Duplicate entry '2147483647' f ...

  3. 利用navicat向mysql数据库导入数据时出现1062 - Duplicate entry '0' for key 'PRIMARY'错误的解决办法

    1062 - Duplicate entry '0' for key 'PRIMARY',明明导入的数据值不一样,但错误提示主键已存在,不能插入.不知道为什么有些数据插入不成功,原因我也不知道. 解决 ...

  4. mysql #1062 –Duplicate entry '1' for key 'PRIMARY'

    把数据从一个机器上导到另外一个机器上,因此记录太多,刚开始没注意,超过了phpmyadmin的限制,提示出错了,我把文件手动的给分成一些小文件,可是再导就提示#1062 - Duplicate ent ...

  5. Navicat导入excel表报错 1062 Duplicate entry '10583779' for key 'PRIMARY'

    今天用Navicat导入数据库是遇到一个问题,excel表格中有三万多条数据,正常导入的只有600条,查看报错发现提示1062 Duplicate entry '10583779' for key ' ...

  6. 使用Navicat插入数据时报错1062 - Duplicate entry ‘menu544073941‘ for key ‘PRIMARY‘

    -> 报错: 1062 - Duplicate entry 'menu544073941' for key 'PRIMARY' -> 原因:数据库表在设计时,没有设置id主键自增,而要插入 ...

  7. SQL学习 | navicat导入数据出现[Err] [Row1] [Imp] 1062 - Duplicate entry '100-2518420' for key 'PRIMARY'错误

    错误原因是主键重复错误,对于数据中有大量重复数据的列,比如ID名称列,将这个列设置为主键的同时也要设置自增长. 主键的作用: 1)保证数据的完整性; 2)约束行记录的唯一性,主键可以用来表示一个精确定 ...

  8. pymysql.err.IntegrityError: (1062, Duplicate entry 'roxml-ROXML' for key 'PRIMARY')

    在<Python数据挖掘-概念.方法与实践>一书的第3章实体匹配中,如果一路按照作者的代码及SQL语句进行配置运行的话,会出现如题目所示的错误.根据python脚本的执行错误提示显示,错误 ...

  9. Python报错:pymysql.err.IntegrityError: (1062, “Duplicate entry ‘1‘ for key ‘PRIMARY‘“)

    1.报错截图: 2.错误原因:数据库表里有数据 因为我开始在数据库的表里写了几条数据,后面发现数据太多了,就不想写了.想把excel表里的数据导进去,但是写了的那几条数据没删,就报错了. 3.解决方法 ...

  10. MySQL报错:IntegrityError: (1062, “Duplicate entry ‘111‘ for key ‘id‘“)

    原因:id字段设置了主键后,不允许输入重复值. 解决方法: (1)删掉已经存在的值后重新插入. (2)将字段的主键约束删除.

最新文章

  1. css position属性
  2. date对象加十分钟_一张图讲解对象锁和关键字synchronized修饰方法(代码块)
  3. Codeforces Round #539 (Div. 1)
  4. 【转】 Android 屏幕切换总结
  5. C 语言实现数组冒泡排序
  6. linux硬件驱动网站,linux怎么查看已装好硬件驱动
  7. 辅助功能性代码,研究和记录代码。
  8. android 实现广告弹窗,Android实现自适应屏幕的弹窗广告
  9. SystemVerilog学习笔记7——覆盖率
  10. ESlint语法检测工具
  11. HDU 3085 Nightmare Ⅱ【BFS +曼哈顿距离+综合性较强】
  12. java中机动车实验_Java-机动车
  13. Matlab标题加变量
  14. 手把手教你使用ModelArts的自动学习识别毒蘑菇分类
  15. hydrus1d使用说明_Hydrus-1D中文说明.doc
  16. 英语Canutillos祖母绿canutillos单词
  17. 《一万年以后》一段充满癫狂想象力的奇幻之旅
  18. python pandas快速上手教程,还不赶紧收藏一波
  19. The OSS Access Key Id you provided does not exist in our records
  20. 电脑桌面云便签怎么设置字体字号大小?

热门文章

  1. mysql execute immediate_动态SQL之EXECUTE IMMEDIATE
  2. python登录系统三次锁定_Python基础篇-账号登录错误三次锁定
  3. 显卡更新后重启计算机就没了,在windows10系统更新显卡后黑屏的解决方法
  4. webstorm绝对路径引入echarts_Webstorm+Webpack+echarts构建个性化定制的数据可视化图表两个echarts详细教程(柱状图,南丁格尔图)...
  5. 访问本地环境时出现The requested URL / was not found on this server.
  6. Selctive Search中的ABO评价方法
  7. Unity中扫描二维码将电脑照片保存在手机中
  8. Elasticsearch: collapse 去重
  9. android * 工程模式,教你认识Android的各种工程模式
  10. 【COGS】1752. [BOI2007]摩基亚Mokia cdq分治模板题