2010-08-11 93 views
3

我有很多行的表,並且沒有id列。我想回去:MySQL - 追溯添加ID AUTO_INCREMENTs

  1. AUTO_INCREMENT
  2. 添加ID列PRIMARY KEY更重要的是,回顧添加一個ID爲所有現有的行,從最舊到最新(有一個「更新時間」柱)。

有什麼建議嗎?

+0

出於好奇,爲什麼ID的順序必須與updatime列匹配?我假設更新記錄時更新時間會發生變化。當您的內容在將來更新時,您是否打算更改記錄的ID? – 2010-08-11 15:51:20

+0

我只需要按時間順序編號 – markelshark 2010-08-11 15:54:53

回答

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列時

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結果集是由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) 

我不知道是否有解決這個更簡單的方法,但這種方法似乎能完成這項工作。

+0

感謝您的詳細說明。我還沒有嘗試過,但會讓你知道它是怎麼回事。謝謝 – markelshark 2010-08-11 15:43:11

+0

完美工作Daniel,謝謝 – markelshark 2010-08-11 16:04:11