如何删除主键约束但保留索引

时间:2017-10-06 05:16:17

标签: indexing mariadb primary-key

我有一个包含超过100K记录的表,该表的主键包含4列。现在我想删除主键但是由于主键定义而保留默认创建的索引,因此应该避免为这么大的数据值重新创建索引。

我正在使用MariaDB 5.5.x版本。

2 个答案:

答案 0 :(得分:1)

当你删除主键时,你不能只保留简单的索引部分。

如果表是innodb,那么最好先删除主键,然后重新创建索引,因为所有secondary indexes contain the primary key也是如此。因此,如果先创建二级索引然后删除pk,那么mariadb也必须修改二级索引。

如果您打算创建另一个pk,那么先创建它,然后出于同样的原因创建任何二级索引。

答案 1 :(得分:1)

在InnoDB中,更改PK(PRIMARY KEY)总是需要重建整个表。周期。

在单个ALTER TABLE中进行所有更改。这是将要发生的事情(所以你可以看到为什么这是最好的)......

  1. 锁定表格(阻止任何写入)。
  2. 使用与原始模式相同的模式创建一个新的(空)表。
  3. ALTER TABLE指示的方式更改所有中的新表格。
  4. 复制所有数据以便新表格。请注意,PK 已更改,这可能涉及重新排列数据。
  5. 重建二级索引。 (我不知道这是作为第3步的一部分完成的,还是作为单独的传递完成的。)
  6. RENAME移动新表取代旧表。 (这是原子的,快速的。)
  7. 解锁。
  8. 如果您有两个ALTERs来对PK进行两次更改,那么您将会经历两次所有这些步骤。

    每个辅助密钥都包含PK列的副本。因此,对PK 的任何更改都需要重建所有辅助密钥。

    在InnoDB中有一个没有PK的表是错误的。 (将提供隐藏的序列号,但这会使维护,复制等更加痛苦。)

    如果你正在谈论InnoDB以外的一些引擎,那么,不要。你应该只使用InnoDB。 (我所说的大部分内容都不适用于MyISAM。)