2012-12-24 30 views
3

我有一箇舊的MS Access數據庫,我正在翻譯成MySQL數據庫。我用bullzip來創建數據庫,但由於設計不當,舊的MS Access數據庫沒有大多數表的唯一主鍵。什麼MySQL聲明需要用增量編號填充字段

所以我創建了一個id字段,但顯然它是空的每個條目,我不知道是否有一個簡單的發言中,我可以用它來填補他們與1,2,3,4等等

編輯: 我覺得我還沒有得到正確的問題。我知道所有關於自動增量。那不是問題。

我有一張表,裏面滿是需要保存的記錄,它來自Access數據庫,沒有將唯一標識定義爲字段。換句話說,我有名字,姓氏等字段,但沒有字段「ID」。這看起來非常瘋狂,但顯然這個數據庫已經很好用了,並且從來沒有任何表格欄的唯一ID。奇怪的!

無論如何,我已經在表中爲id創建了一個字段(並將其設置爲自動增量當然),但顯然現有的所有記錄都沒有設置id。所以我需要爲每條記錄創建一個。

有沒有辦法用mysql語句填充所有這些記錄的唯一編號?

乾杯

+0

檢查我更新的解決方案,讓我知道。 – Ravi

回答

5

如果您將一個新的id列添加到現有表並使其成爲AUTO_INCREMENT PRIMARY KEY,它將自動使用遞增值填充它。

mysql> ALTER TABLE TheTable ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY; 
mysql> SELECT id FROM TheTable; 
-- outputs values 1, 2, 3, etc. 

如果你做一個id列,但沒有宣佈它AUTO_INCREMENT PRIMARY KEY,你可以填充柱是這樣的:

mysql> SET @id := 0; 
mysql> UPDATE TheTable SET id = (@id := @id+1); 
+0

你太棒了!謝謝您的幫助!作品一種享受 –

2

使用預定義的AUTO_INCREMENT領域,插入新記錄時所設置的空值,所以它會自動建立一個適當的增量。除此之外,沒有辦法(除非使用過程)創建一組遞增的值

0

使用AUTO_INCREMENT

CREATE TABLE insect 
    (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (id), 
    name VARCHAR(30) NOT NULL, 
    date DATE NOT NULL, 
    origin VARCHAR(30) NOT NULL 
    ); 

更新

我相信,這似乎艱鉅的任務,除非你將不能創建新表,我建議你使用這個

SET @rank=0; 
SELECT @rank:[email protected]+1 AS rank, itemID FROM orders; 

它會爲您創建一個名爲rank的虛擬列,它具有唯一的id值。

0

如果你只是想要一個唯一的標識符,你可以使用uuid()函數。它佔用了比整數多一點的空間,但它可以做到你想要的。

但是,我同意其他答案,您應該添加一個自動增量列並重新填充表。這是讓id始終保持唯一性的最簡單方法,即使發生更新並使用更合理的存儲量也是如此。

0

我不擅長MySQL,但是我在其他DBMS中遇到了同樣的問題,這裏是我在解決AutoIncrement類型設置時遇到的問題,但DBMS無法自動應用它:

  1. 重命名要添加ID字段的表。因此,將Table1重命名爲Table1_Old。
  2. 創建一個新的Table1,它是Table1_Old的一個副本,只是它沒有數據。
  3. 將您的ID/AutoIncrement列添加到表1
  4. 現在將Table1_Old中的所有數據複製到Table1,爲ID列跳過或指定NULL。 (這通常是單個INSERT..SELECT ..命令)
  5. 刪除Table1_Old。

從DBMS到DBMS的實際細節和命令各不相同,但我通常能夠找到一種方法來執行這些步驟。