2011-11-03 118 views
8

因此,當試圖向字段添加自動增量時,它出現#1062-對於密鑰1的重複條目'1'。我嘗試刪除主鍵,並重新添加它,並且工作正常(我假設如果有重複?)#1062 - 對於密鑰1的重複條目'1' - 沒有找到重複的條目

但是,當我嘗試添加一個自動增量字段它會引發錯誤。它給了我它運行下面的SQL一個瀏覽選項:

SELECT * 
FROM `myTbl` 
WHERE CONCAT_WS("-", 11) = "1" 
ORDER BY 11 
LIMIT 0 , 30 

然而,這會返回一個空的結果集..提示有沒有重複。所以,如果沒有重複,我怎麼不能添加自動增量?

+0

你認爲CONCAT_WS(「 - 」,11)的結果是什麼?我總是得到11 ... – glglgl

+0

請發佈'SHOW CREATE TABLE myTbl'的結果和您用於添加自動增量的命令。還要注意'CONCAT_WS(' - ',11)='1''將始終評估爲「FALSE」。你不能像'ORDER BY'那樣在'WHERE'子句中使用字段的序號。 – Quassnoi

+0

所以你不覺得我很蠢,我沒有寫這個SQL--它是在phpMyAdmin生成錯誤後按下瀏覽按鈕時生成的。我認爲下面的海報(Michael Mior)是對的,我現在正在嘗試這個解決方案。 – Ashley

回答

20

對於此列,您是否有任何值爲0NULL的行? ALTER TABLE可能導致主鍵被重新排序。在密鑰爲0的情況下,MySQL將嘗試給它賦值1,如果密鑰1已經存在,則該值將失敗。

嘗試將列中的任何0NULL值更改爲更高(和未使用)的值。如果要插入行使用這樣的代碼

+0

@Micheal,如果你嘗試向PK中插入0,會發生什麼情況取決於MySQL所處的SQL模式。如果它處於old-skool鬆弛模式,它將不會替換1,而是給出下一個自動增量。如果它處於推薦的嚴格模式下,它將插入'0'。 – Johan

+0

@Johan好點。不過,我仍然懷疑這會解決問題。 –

+0

這工作 - 在那裏有一個0;謝謝! – Ashley

0
SELECT *       <<-- Select * is an anti-pattern 
FROM myTbl 
WHERE CONCAT_WS("-", 11) = "1" <<-- You are not selecting a column 
ORDER BY 11      <<-- This however does refer to a column. 
LIMIT 30 OFFSET 0 

重寫查詢到

SELECT field1, field2, field3, ...., field11 
FROM myTbl 
WHERE COALESCE(field1, field2, field3, field11) = '1' 
ORDER BY field11    
LIMIT 30 OFFSET 0 

:如果您想選擇

INSERT INTO table1 (/*do not list the PK!*/ field2, field3, field4) 
    VALUES ('a', 'test' ,'b' ,'example'); 

所有重複行使用:

SELECT id, count(*) as duplicate_count 
FROM table1 
GROUP BY id 
HAVING duplicate_count > 1 

您需要更新這些ID被列爲重複。

另一種方法是添加一個額外的列並刪除舊的PK。

ALTER TABLE table1 ADD COLUMN new_id unsigned integer not null auto_increment primary key; 
ALTER TABLE table1 DROP COLUMN id; 
ALTER TABLE table1 CHANGE COLUMN newid id; 
+0

除非我誤解,否則問題在於OP無法將'AUTO_INCREMENT'添加到列。我不明白這是如何解決這個問題的。 –

2

如果您可以更改表格中的數據,Michael Mior的答案將有效。不過,還有一個解決方法可以讓數據保持原樣(我已經在MySQL 5.5上測試過)。請記住,在MySQL中使用零值作爲主鍵不是僅僅因爲這個原因的推薦做法。如果你可以擺脫零,那麼做。

禁用自動值時產生一個零插入:

SET SQL_MODE=NO_AUTO_VALUE_ON_ZERO; 

添加AUTO_INCREMENT到你的專欄:

ALTER TABLE ... AUTO_INCREMENT; 

重新啓用自動值生成:

SET SQL_MODE=''; 

它應該在整個操作過程中向表中插入數據是不容許的。否則,列中會有不需要的零值。