我有很多行的表,並且沒有id列。我想回去:MySQL - 追溯添加ID AUTO_INCREMENTs
- 與
AUTO_INCREMENT
- 添加ID列
PRIMARY KEY
更重要的是,回顧添加一個ID爲所有現有的行,從最舊到最新(有一個「更新時間」柱)。
有什麼建議嗎?
我有很多行的表,並且沒有id列。我想回去:MySQL - 追溯添加ID AUTO_INCREMENTs
AUTO_INCREMENT
PRIMARY KEY
更重要的是,回顧添加一個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)
然後我們就可以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 NULL
和AUTO_INCREMENT
結果集是由updatetime
列排序:
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)
我不知道是否有解決這個更簡單的方法,但這種方法似乎能完成這項工作。
感謝您的詳細說明。我還沒有嘗試過,但會讓你知道它是怎麼回事。謝謝 – markelshark 2010-08-11 15:43:11
完美工作Daniel,謝謝 – markelshark 2010-08-11 16:04:11
出於好奇,爲什麼ID的順序必須與updatime列匹配?我假設更新記錄時更新時間會發生變化。當您的內容在將來更新時,您是否打算更改記錄的ID? – 2010-08-11 15:51:20
我只需要按時間順序編號 – markelshark 2010-08-11 15:54:53