gpt4 book ai didi

MySQL - 追溯添加 AUTO_INCREMENTs 的 ID

转载 作者:可可西里 更新时间:2023-11-01 08:38:08 24 4
gpt4 key购买 nike

我的表有很多行,但没有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com