【问题标题】:Inserting into mysql table with archive engine "duplicate key" error使用存档引擎“重复键”错误插入 mysql 表
【发布时间】:2013-08-07 23:26:42
【问题描述】:

我正在尝试使用 mysql 存档引擎存档一些文件。我正在使用此查询来插入文件内容:

insert into test_table (id,arch) values (123,'FILE_CONTENT')

插入 2 条记录后,我从 mysql 收到“重复键”错误,因为表中不存在一个键。我检查了 5 次,但没有记录。我为重复的 id 选择了 count(*),结果为 0。

我用 innodb 引擎检查了相同的代码,它工作正常。谁能告诉我存档引擎有什么问题?

编辑:

我的餐桌信息是

CREATE TABLE `test_table` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `arch` mediumtext,
  PRIMARY KEY (`id`)
) ENGINE=ARCHIVE AUTO_INCREMENT=100175977 DEFAULT CHARSET=utf8mb4;

【问题讨论】:

  • 请发布您的表格定义。这不应该。这个表有触发器吗?
  • 我编辑了我的问题,但桌面上没有触发器。

标签: mysql archive


【解决方案1】:

您似乎在ARCHIVE 引擎中发现了一个错误。一旦您尝试插入一条其 AUTO_INCREMENT 列的值小于表的 AUTO_INCREMENT 属性的记录,插入似乎就会失败。

这很好用:

CREATE TABLE test_table1 (
  id INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (id)
) ENGINE=ARCHIVE AUTO_INCREMENT=123; -- notice the AUTO_INCREMENT value

INSERT INTO test_table1 (id) value (123); -- ok

但这会因“重复键”而失败:

CREATE TABLE test_table2 (
  id INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (id)
) ENGINE=ARCHIVE AUTO_INCREMENT=124; -- notice the AUTO_INCREMENT value

INSERT INTO test_table2 (id) value (123); -- duplicate key

MyISAM 和 InnoDB 没有表现出这种行为,我在文档中找不到对此的参考。如果我是你,我会向 MySQL 提交一个错误(在 v5.5.6v5.5.32 下验证)。

【讨论】:

  • 我不太擅长阅读 C++,但似乎出于性能原因,处理唯一性检查的代码已被故意削弱(来自line 982)。也许知道的人可以验证一下。
  • 根据dba.stackexchange.com/questions/47662/…,存档表中似乎不可能有索引列。唯一的方法是使用在插入期间不应设置的自动增量(或仅使用 0)。
  • 这个答案是自相矛盾的,尽管它引用了相关的手动摘录(“AUTO_INCREMENT 列可以具有唯一或非唯一索引”)。它还包含可疑信息,例如“[为 AUTO_INCREMENT 列插入具有显式值的行] 将为其他存储引擎生成正常的重复键”(InnoDB 的相同插入成功)。它与AUTO_INCREMENT 无关,但与PRIMARY KEY 无关。然而,ARCHIVE 表并不意味着要经常阅读。顾名思义,它是一种节省空间的存储解决方案。
  • 恕我直言,剩下的问题是: 1. 你为什么选择这个引擎?如果您打算经常阅读此表,那么它可能不是最佳选择。 2.你想了解MySQL的内部机制吗?然后相信我,这很可能是一个错误。它可能应该被视为一个文档错误:我们发现的限制应该记录在案,而不是固定,因为用例似乎不符合 ARCHIVE 引擎的目的。
  • @AliBZ 仅供参考,此错误已报告给 MySQL。请参阅this bug report,尤其是 Shane Bester 在 2008 年 12 月 22 日 20:43 建议的测试用例几乎完全描述了您的情况。
猜你喜欢
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 2018-06-25
  • 1970-01-01
  • 2022-08-24
  • 2015-06-22
  • 1970-01-01
相关资源
最近更新 更多