ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

在MySQL中的ROLLBACK之后复制UNIQUE KEY错误

2019-08-06 22:16:00  阅读:318  来源: 互联网

标签:mysql unique-key mysql-5 transaction


我有一张这样的桌子

mysql> describe seudonimos;
+--------------+------------------+------+-----+---------+----------------+
| Field        | Type             | Null | Key | Default | Extra          |
+--------------+------------------+------+-----+---------+----------------+
| id_seudonimo | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| seudonimo    | varchar(45)      | NO   | UNI | NULL    |                |
+--------------+------------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)

我们假设它是空的,因此自动增量为0.例如:

SET AUTOCOMMIT=0;
BEGIN TRANSACTION;
INSERT INTO seudonimos (seudonimo) VALUES ('Agatha Christie');
ROLLBACK;
SET AUTOCOMMIT=1;

据我所知,回滚不会影响自动增量.因此,如果我插入一个新值,则自动增量将为2而不是1.但如果我再次尝试插入“Agatha Christie”,则会出现以下问题:

INSERT INTO seudonimos (seudonimo) VALUES ('Agatha Christie');

#1062 - Duplicate entry 'Agatha Christie' for key 'seudonimo'

这不是我的预期.我期待这个:

+--------------+--------------------+
| id_seudonimo | seudonimo          |
+--------------+--------------------+
|            2 | Agatha Christie    |
+--------------+--------------------+

怎么了?

解决方法:

在你对自己的问题的一个评论中,你说你正在使用MyISAM.

但是,MyISAM不支持交易(见ref. table).因此,无论您是否尝试将其关闭,它都将始终自动提交.

如果要使用事务,则需要使用支持它的引擎,例如InnoDB.

编辑(以下评论和其他信息 – 我必须承认,在@RolandoMySQLDBA指出之前我还没有意识到你也在使用第二个表):

正如文件所述:“If you use tables that are not transaction-safe within a transaction, changes to those tables are stored at once, regardless of the status of autocommit mode.”

由于第二个表(seudonimos_consulta,使用MyISAM)涉及事务,通过触发器,在该表中的第一个INSERT之后插入的内容不会回滚.因此,#1062 – 关键’seudonimo’的重复条目’Agatha Christie’将引用第二个表seudonimos_consulta.seudonimo,而不是seudonimos.seudonimo.

标签:mysql,unique-key,mysql-5,transaction
来源: https://codeday.me/bug/20190806/1603798.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有