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

Indexing 如何删除主键约束但保留索引,indexing,mariadb,primary-key,Indexing,Mariadb,Primary Key,我有一个包含超过100K条记录的表,该表的主键由4列组成。现在我想删除主键,但保留由于主键定义而默认创建的索引,这样就可以避免为如此大的数据值重新创建索引 我使用的是MariaDB 5.5.x版本 删除主键时,不能只保留简单的索引部分 如果表是innodb,那么最好先删除主键,然后重新创建索引,因为所有索引都是这样。因此,如果您先创建二级索引,然后删除pk,那么mariadb也必须修改二级索引 如果您计划创建另一个pk,那么首先创建该pk,然后出于同样的原因创建任何辅助索引。当您删除主键时,您不

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


我使用的是MariaDB 5.5.x版本

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

如果表是innodb,那么最好先删除主键,然后重新创建索引,因为所有索引都是这样。因此,如果您先创建二级索引,然后删除pk,那么mariadb也必须修改二级索引


如果您计划创建另一个pk,那么首先创建该pk,然后出于同样的原因创建任何辅助索引。

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

如果表是innodb,那么最好先删除主键,然后重新创建索引,因为所有索引都是这样。因此,如果您先创建二级索引,然后删除pk,那么mariadb也必须修改二级索引


如果您计划创建另一个pk,那么首先创建该pk,然后出于相同的原因创建任何二级索引。

在InnoDB中,更改pk(
主键
)总是需要重建整个表。句号

在单个
ALTER表中进行所有更改
。下面是将要发生的事情(因此您可以看到为什么这是最好的)

  • 锁定表(以阻止任何写入)
  • 使用与原始表相同的架构创建新(空)表
  • 按照
    ALTER table
    指示的所有方式更改新表
  • 复制所有数据以创建新表。请注意,如果PK发生更改,这可能涉及重新排列数据
  • 重建二级索引。(我不知道这是作为第3步的一部分完成的,还是作为一个单独的过程完成的。)
  • 重命名
    以移动新表代替旧表。(这是原子式的、快速的。)
  • 解锁
  • 如果您有两个
    更改
    来对PK进行这两个更改,那么您将经历所有这些步骤两次

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

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


    如果你说的是InnoDB以外的引擎,那就别提了。您应该只使用InnoDB。(我所说的大部分内容不适用于MyISAM。)

    在InnoDB中,更改PK(
    主键)总是需要重建整个表。句号

    在单个
    ALTER表中进行所有更改
    。下面是将要发生的事情(因此您可以看到为什么这是最好的)

  • 锁定表(以阻止任何写入)
  • 使用与原始表相同的架构创建新(空)表
  • 按照
    ALTER table
    指示的所有方式更改新表
  • 复制所有数据以创建新表。请注意,如果PK发生更改,这可能涉及重新排列数据
  • 重建二级索引。(我不知道这是作为第3步的一部分完成的,还是作为一个单独的过程完成的。)
  • 重命名
    以移动新表代替旧表。(这是原子式的、快速的。)
  • 解锁
  • 如果您有两个
    更改
    来对PK进行这两个更改,那么您将经历所有这些步骤两次

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

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


    如果你说的是InnoDB以外的引擎,那就别提了。您应该只使用InnoDB。(我所说的大部分内容不适用于MyISAM。)

    您可以尝试这样做——在删除主键之前,在键列上创建一个索引,然后删除主键。这可能比删除PK和创建新索引花费的时间要少。您可以尝试这样做-在删除主键之前,在键列上创建索引,然后删除主键。这可能比删除PK并创建新索引所需的时间要短。