【问题标题】:Is it possible to add a autoincrement primary index column in full mysql table belated?是否可以在完整的 mysql 表中添加自动增量主索引列?
【发布时间】:2011-05-31 19:39:57
【问题描述】:

假设这个表有近 5 000 000 行

CREATE TABLE `author2book` (
  `author_id` int(11) NOT NULL,
  `book_id` int(11) NOT NULL,
  KEY `author_id_INDEX` (`author_id`),
  KEY `paper_id_INDEX` (`book_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

是否可以添加主索引列idautoincrement 作为第一位?我期待这样的事情:

CREATE TABLE `author2book` (
  `id` int(11) NOT NULL AUTO_INCREMENT,  <<<<  This is what I try to achieve!
  `author_id` int(11) NOT NULL,
  `book_id` int(11) NOT NULL,
  KEY `author_id_INDEX` (`author_id`),
  KEY `paper_id_INDEX` (`book_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

这可能吗?

编辑:我应该提到,我希望填充添加的列。

【问题讨论】:

  • 仅供参考,您已将 paper_id 的列定义从 CREATE TABLE 语句中删除...您需要在示例语句中添加 paper_id int(11) NOT NULL, 或类似内容。
  • @joelhardi:这只是一个类型错误。我纠正了这一点。谢谢!
  • 酷,我认为这只是一个复制和粘贴错误,只是认为如果示例代码对其他阅读该问题的人有用会很好。
  • @joelhardi,你说得对。感谢您指出了这一点。我敢肯定,如果问题和答案都是一致的,人们会很感激的。

标签: mysql primary-key add


【解决方案1】:

您可以使用 ALTER TABLE 在一个命令中添加列和索引。即:

ALTER TABLE author2book ADD id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (id);

请参阅MySQL docs for ALTER TABLE 了解更多信息。

【讨论】:

  • 添加的索引会被填充还是我必须手动填充?
  • @Aufwind,它会被填充,但我建议你喝点咖啡,这可能需要一段时间。
  • Aufwind,是的,这将创建索引(主键始终是索引)。你可以SHOW INDEXES FROM author2book;查看。首先在表的副本上运行以查看您的 5000000 条记录需要多长时间绝对是一个好主意。
  • @Johan: Query OK, 4355000 rows affected (1 min 20.57 sec) Records: 4355000 Duplicates: 0 Warnings: 0 那是一杯速食咖啡... ;-) 不过感谢您的警告。我也预料到了,需要更长的时间。
  • MyISAM 只是一个大的哈希表,所以这样的东西基本上只是给硬盘一个大的锻炼,它需要多长时间完全取决于你的磁盘硬件。如果您的数据库位于 10K RPM 磁盘的大型 RAID 上,它会比单磁盘台式机快很多。
【解决方案2】:

使用您想要的结构和自动递增键创建一个新表,然后将该表中的所有记录插入到该新表中...然后删除(或重命名)原始表,并重命名新表表改成原来的名字。

insert into newTable (author_id, book_id) 
select * from author2book

newTable 然后将包含您想要的输出。

【讨论】:

  • 没有投反对票,但不需要单独的表,只需一个将字段更改为自动增量的 alter table 即可,此外,alter table 执行以下操作 1. 创建一个空表新结构 2. 复制超过 3. 的行 删除旧表 4. 将新表重命名为与旧表同名。
【解决方案3】:
ALTER TABLE author2book
ADD COLUMN `id` int(11) NOT NULL FIRST;

手动填充 id 字段(可能是通过脚本?),然后:

ALTER TABLE author2book
MODIFY COLUMN `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY;

【讨论】:

  • "可能是脚本?"我认为这是 OP 问题的症结所在。
  • @Fosco,你说得对。我编辑了我的问题以指出这一点。
猜你喜欢
  • 2013-11-05
  • 2013-10-22
  • 2014-02-10
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
相关资源
最近更新 更多