MySQL - 回顾性地添加AUTO_INCREMENTs的ID

时间:2010-08-11 15:13:15

标签: mysql

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

  1. 使用PRIMARY KEY
  2. 添加ID列AUTO_INCREMENT
  3. 更重要的是,追溯性地为所有现有行添加ID,从最旧到最新(有一个'updatetime'列)。
  4. 有什么建议吗?

1 个答案:

答案 0 :(得分:2)

让我们考虑以下示例:

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)

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

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)

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