添加 UNIQUE 索引失败并出现重复条目​​错误,但未找到重复项

Rom*_*n K 6 mysql myisam mariadb index

给定表:

CREATE TABLE mytable (
  field_a CHAR(15) NOT NULL DEFAULT '',
  field_b MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
  field_c SMALLINT UNSIGNED NOT NULL DEFAULT 0,
  field_d SMALLINT UNSIGNED NOT NULL DEFAULT 0,
  field_e CHAR(1) NULL DEFAULT '',
  field_f SMALLINT UNSIGNED NOT NULL DEFAULT 0
) ENGINE=MyISAM DEFAULT CHARACTER SET=UTF8 COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)

所需索引:

ALTER TABLE mytable ADD UNIQUE INDEX idx_key (field_a, field_b);
Run Code Online (Sandbox Code Playgroud)

数据大小约为 51 Mio。行。以下问题:

尝试 1:如果我在表中的数据之后尝试创建索引,它会因重复键错误而失败。对失败键的选择仅返回一个 (!) 行。

 [23000][1062] Duplicate entry 'aaaaaaaaaaaaaaa-11111' for key 'idx_key'

 SELECT COUNT(*) FROM mytable WHERE field_a='aaaaaaaaaaaaaaa' AND field_b='11111'
Run Code Online (Sandbox Code Playgroud)

返回 1 (!)

尝试 2:如果我在一个空表上创建索引或创建一个组合私钥,然后将数据放入表中,则该表仅包含 51 个 Mio 中的 27 个。行(!)。

唯一索引或错误是否有某种限制?

我使用 MariaDB 10.0.20。请帮忙。

更新 1

唯一行的计数

SELECT COUNT(DISTINCT field_a,field_b) from mytable; 
Run Code Online (Sandbox Code Playgroud)

返回 50 个 Mio 行。所以大约有 1 个 Mio 重复。然而,这并不能解释尝试 2 中的 27 Mio 或尝试 1 中的错误异常。

更新 2

尝试 2 使用的表:

CREATE TABLE mytable (
  field_a CHAR(15) NOT NULL DEFAULT '',
  field_b MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
  field_c SMALLINT UNSIGNED NOT NULL DEFAULT 0,
  field_d SMALLINT UNSIGNED NOT NULL DEFAULT 0,
  field_e CHAR(1) NULL DEFAULT '',
  field_f SMALLINT UNSIGNED NOT NULL DEFAULT 0,
  UNIQUE KEY idx_key (field_a, field_b)
) ENGINE=MyISAM DEFAULT CHARACTER SET=UTF8 COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)

更新 3

尝试 2 错误已解决

为了填充表,我们使用 INSERT 语句,每个语句有多个值行。如果插入的单个值违反了唯一约束,则所有其他值也未插入并导致 27 Mio 行而不是 50 Mio。

方法 1:但是,即使在删除并重新创建数据库后,错误重复条目消息的错误仍然存​​在,但这是我可以/必须忍受的邪恶。

Rom*_*n K 5

无法保证aaaaaaaaaaaaaaa-11111消息中的值

[23000][1062] Duplicate entry 'aaaaaaaaaaaaaaa-11111' for key 'mykey'
Run Code Online (Sandbox Code Playgroud)

是实际导致违规的值。似乎是 MariaDB 和 MySQL 中的一个错误。

  • 因为返回的组合只存在一次。我想它只是一个消息错误。Evtl。左邻居或右邻居是真正的重复条目。 (2认同)