MySQL - 追溯添加 AUTO_INCREMENTs 的 ID

标签 mysql

我的表有很多行,但没有 id 列。我想回去并:

  1. 使用 AUTO_INCREMENT 添加一个 ID 列作为 PRIMARY KEY
  2. 更重要的是,追溯地为所有现有行添加一个 ID,从最旧到最新(有一个“更新时间”列)。

有什么建议吗?

最佳答案

让我们考虑以下示例:

CREATE TABLE your_table (some_value int, updatetime datetime);

INSERT INTO your_table VALUES (100, '2010-08-11 12:09:00');
INSERT INTO your_table VALUES (300, '2010-08-11 12:08:00');
INSERT INTO your_table VALUES (200, '2010-08-11 12:07:00');
INSERT INTO your_table VALUES (400, '2010-08-11 12:06:00');
INSERT INTO your_table VALUES (600, '2010-08-11 12:05:00');
INSERT INTO your_table VALUES (500, '2010-08-11 12:04:00');
INSERT INTO your_table VALUES (800, '2010-08-11 12:03:00');

首先我们可以添加id列:

ALTER TABLE your_table ADD id int unsigned;

现在表格看起来像这样:

SELECT * FROM your_table;
+------------+---------------------+------+
| some_value | updatetime          | id   |
+------------+---------------------+------+
|        100 | 2010-08-11 12:09:00 | NULL |
|        300 | 2010-08-11 12:08:00 | NULL |
|        200 | 2010-08-11 12:07:00 | NULL |
|        400 | 2010-08-11 12:06:00 | NULL |
|        600 | 2010-08-11 12:05:00 | NULL |
|        500 | 2010-08-11 12:04:00 | NULL |
|        800 | 2010-08-11 12:03:00 | NULL |
+------------+---------------------+------+
7 rows in set (0.00 sec)

然后当结果集按 updatetime 列排序时,我们可以用行号UPDATE id 列:

SET @row_number := 0;

UPDATE    your_table
SET       your_table.id = (@row_number := @row_number + 1)
ORDER BY  your_table.updatetime;

现在表格看起来像这样:

SELECT * FROM your_table ORDER BY id;
+------------+---------------------+----+
| some_value | updatetime          | id |
+------------+---------------------+----+
|        800 | 2010-08-11 12:03:00 |  1 |
|        500 | 2010-08-11 12:04:00 |  2 |
|        600 | 2010-08-11 12:05:00 |  3 |
|        400 | 2010-08-11 12:06:00 |  4 |
|        200 | 2010-08-11 12:07:00 |  5 |
|        300 | 2010-08-11 12:08:00 |  6 |
|        100 | 2010-08-11 12:09:00 |  7 |
+------------+---------------------+----+

然后我们可以将 id 列设置为主键,并使其成为 NOT NULLAUTO_INCREMENT:

ALTER TABLE your_table 
MODIFY id int unsigned NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (id);

这是表格的新描述:

DESCRIBE your_table;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| some_value | int(11)          | YES  |     | NULL    |                |
| updatetime | datetime         | YES  |     | NULL    |                |
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
+------------+------------------+------+-----+---------+----------------+
3 rows in set (0.04 sec)

我们现在可以尝试在表中INSERT 一个新行来确认AUTO_INCREMENT 是否按预期工作:

INSERT INTO your_table (some_value, updatetime)
VALUES (900, '2010-08-11 12:10:00');

SELECT * FROM your_table ORDER BY id;
+------------+---------------------+----+
| some_value | updatetime          | id |
+------------+---------------------+----+
|        800 | 2010-08-11 12:03:00 |  1 |
|        500 | 2010-08-11 12:04:00 |  2 |
|        600 | 2010-08-11 12:05:00 |  3 |
|        400 | 2010-08-11 12:06:00 |  4 |
|        200 | 2010-08-11 12:07:00 |  5 |
|        300 | 2010-08-11 12:08:00 |  6 |
|        100 | 2010-08-11 12:09:00 |  7 |
|        900 | 2010-08-11 12:10:00 |  8 |
+------------+---------------------+----+
8 rows in set (0.00 sec)

我不确定是否有更简单的方法来解决这个问题,但这种方法似乎可以解决问题。

关于MySQL - 追溯添加 AUTO_INCREMENTs 的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3459876/

相关文章:

mysql - 如何将一些 mysqldump 文件恢复到本地 Joomla 数据库?

php - 如何在 CI Active Record 中按 MAX 日期进行选择

mysql - 尝试从 MySQL 数据库获取数据时在 Qlikview 中出现 SQL 错误

mysql - 在 Ruby on Rails 中处理定点/精度小数的最佳方法

php - 在 Laravel 5.2 中访问多个链接表中的所有数据

php - 回显 MySQL 列的内容打印出 'undefined'

mysql - 无法将 a 插入 MySQL 中的 DATETIME 列

mysql - 非规范化建议

mysql - 语法错误 #1064

mysql - 与前一天相比增加和减少的访客数量 - sql