2012-08-29 29 views
2

我有一個有很多行(大約10k行)的現有表,其中有兩列作爲主鍵,因爲它充當兩個其他表之間的多對多關係的中間表。將MySQL @rowid賦值爲

對於新的需求,我需要指定添加新列(例如id),它必須是具有自動增量值的主鍵。我跑以下查詢:

ALTER TABLE `momento_distribution` ADD `id` INT(11) NOT NULL FIRST; 
ALTER TABLE `momento_distribution` DROP PRIMARY KEY , ADD PRIMARY KEY ( `id`); 

首先查詢成功運行,但產生以下錯誤第二個查詢:

1062 - Duplicate entry '0' for key 'PRIMARY' 

原因是顯而易見的,新列id得到0爲默認值,主鍵不能有重複值。

現在我纔可以運行第二個查詢,我需要像1,2,3新列設置增量值...

在Oracle中,我知道,這是可以通過ROWID完成。 MySQL也有相應的@rowid。有人可以請建議一個查詢設置列值爲id列的@rowid?

請注意:這必須通過查詢來完成,因爲我無法手動更改10000行。

回答

2

同樣的問題用不同的方式詢問。參考那個問題。

MySQL 1062 - Duplicate entry '0' for key 'PRIMARY'

總之, 1.刪除現有的FK 2.刪除現有的PK 3.運行你的第一個查詢作爲

ALTER TABLE `momento_distribution` ADD `id` INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL FIRST; 

這也將不依賴於@rowid分配唯一的號碼 4.如果需要,將FK添加到較早的列。

4

您需要同時將其設置爲AUTO_INCREMENT,它將填充它;

ALTER TABLE momento_distribution 
    ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; 

演示here

編輯:如果你有一個現有的主鍵,你需要同時刪除它;

ALTER TABLE momento_distribution 
    DROP PRIMARY KEY, 
    ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; 
+0

謝謝@Joachim。 +1爲SQL Fiddle演示(我知道JS Fiddle但不是SQLFiddle)。這給了我信心。不幸的是我今天離開了辦公室。急切地等待在我桌子上測試。再次感謝。 –

+0

對不起@Joachim,但它不會工作。我只是像** name VARCHAR(32)PRIMARY KEY **一樣將主鍵添加到表中,並且失敗。在我的情況下,我已經有了現有的主鍵。 –

+0

使用替換現有主鍵的語句進行編輯。 SQLFiddle表只是一個示例表,用於顯示alter table如何工作,您想要的是上面的語句; 'ALTER TABLE momento_distribution DROP PRIMARY KEY, ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;' –