首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL中回滚后复制唯一键错误

在MySQL中回滚后复制唯一键错误
EN

Database Administration用户
提问于 2011-08-02 19:26:19
回答 1查看 1.7K关注 0票数 3

我有一张这样的桌子

代码语言:javascript
复制
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。例如:

代码语言:javascript
复制
SET AUTOCOMMIT=0;
BEGIN TRANSACTION;
INSERT INTO seudonimos (seudonimo) VALUES ('Agatha Christie');
ROLLBACK;
SET AUTOCOMMIT=1;

就我所知,回滚不影响自动增量。因此,如果我插入一个新的值,自动增量将是2而不是1。但是如果我再次插入'Agatha Christie‘,我会遇到以下问题:

代码语言:javascript
复制
INSERT INTO seudonimos (seudonimo) VALUES ('Agatha Christie');

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

这不是我所期望的。我预料到:

代码语言:javascript
复制
+--------------+--------------------+
| id_seudonimo | seudonimo          |
+--------------+--------------------+
|            2 | Agatha Christie    |
+--------------+--------------------+

怎么了?

EN

回答 1

Database Administration用户

回答已采纳

发布于 2011-08-04 19:22:51

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

但是,MyISAM不支持事务(请参阅参考表格)。因此,无论您是否关闭它,它都会自动提交。

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

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

如文档所述:“如果在事务中使用不安全的表,则会立即存储对这些表的更改,而不管自动提交模式的状态如何”

由于第二个表(seudonimos_consulta,使用MyISAM)是通过触发器在事务中涉及到的,所以在该表中的第一个INSERT之后插入的内容不会回滚。因此,#1062 - Duplicate entry 'Agatha Christie' for key 'seudonimo'将引用第二个表,seudonimos_consulta.seudonimo,而不是seudonimos.seudonimo

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/4257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档