2011-11-03 24 views
8

フィールドにオートインクリメントを追加しようとすると、キー#1に重複エントリ '1'が表示されます。私はプライマリキーを削除して再追加して、それは正常に動作します(重複があった場合はないと思います)。#1062 - キー1の重複エントリ '1' - 重複エントリが見つかりません

しかし、フィールドにオートインクリメントを追加しようとすると、エラーがスローされます。それは私に次のSQLを実行する参照オプションを与えます:

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

しかし、これは空の結果セットを返します。重複がないことを示します。だから重複がない場合、私はどのように私はautoincrementを追加することはできませんか?

+0

'CONCAT_WS(" - "、11)'の結果はどうなると思いますか?私はいつもそこに11を得ます... – glglgl

+0

'SHOW CREATE TABLE myTbl'の結果とあなたがautoincrementを追加するために使うコマンドを投稿してください。 'CONCAT_WS( ' - '、11)= '1'は常にFALSEと評価されることにも注意してください。 'WHERE'節でフィールドの序数を' ORDER BY'のように使うことはできません。 – Quassnoi

+0

だから、私はditzyだとは思わない、私はそのSQLを記述していない - それはphpMyAdminがエラーを生成した後にブラウズボタンを押して生成された。私は以下のポスター(Michael Mior)が正しいと思っています。私は今、その解決策を試しています。 – Ashley

答えて

20

この列に値0またはNULLの行がありますか? ALTER TABLEは、主キーの再配列を引き起こす可能性があります。キーが0の場合、MySQLは値1を与えようとしますが、キー1がすでに存在すると失敗します。

列内の値0またはNULLを何らかの高位(未使用)に変更してみてください。あなたはすべての重複行を使い選択したい場合は

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

:あなたはこのような行を使用コードを挿入したい場合は

+0

@Micheal、PKに0を挿入しようとすると、MySQLがあるSQLモードに依存します。古いスキル緩和モードでは、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 

に問合せをリライト

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

マイケル・ミオールの答えは、テーブルのデータを変更できる場合に機能します。しかし、データを損なわないようにする回避策もあります(MySQL 5.5でこれをテストしました)。この理由から、MySQLでは主キーとしてゼロの値を持つことはお勧めできません。あなたがゼロを取り除くことができたら、それをやりなさい。

無効に自動値生成ゼロが挿入されます。

SET SQL_MODE=NO_AUTO_VALUE_ON_ZERO; 

は、あなたの列にAUTO_INCREMENTを追加します。

ALTER TABLE ... AUTO_INCREMENT; 

再度有効に自動値生成:

SET SQL_MODE=''; 

それはすべきですこの全操作中にテーブルにデータを挿入することは許されません。それ以外の場合は、列に望ましくないゼロ値があります。

関連する問題