MySqlは列をauto_incrementにすることができません
-
28-10-2019 - |
質問
「Id」(PK)、「KlantId」、「Datum」、「BestellingsTypeId」の4つの列を持つテーブル「Bestelling」がありますが、列IDをauto_incrementにしたいと思います。つまり、このエラーが発生します: ジェネラコディセタグプレ
誰かアイデアがありますか?
解決
これは、テーブルにIDが0(または負)の既存のレコードが含まれている場合に発生します。正の値を使用するように既存のすべてのレコードを更新すると、その列にauto_incrementを設定できるようになります。
編集:何人かの人々はその0がどうやってそこに入ったのか尋ねました。明確にするために、MySQLリファレンスマニュアルには、「数値型の場合、デフォルトは0です。ただし、AUTO_INCREMENT属性で宣言された整数型または浮動小数点型の場合、デフォルトはシーケンスの次の値です」と記載されています。したがって、auto_incrementを有効にする前に数値列の値を指定せずにテーブルに挿入を実行した場合、挿入中にデフォルトの0が使用されます。詳細については、 https://dev.mysql.com/doc/を参照してください。refman / 5.0 / en / data-type-defaults.html 。
他のヒント
1つの行の値が0であるauto_incrementに列を変換しようとしたときにもこの問題が発生しました。0の値を一時的に変更する代わりに、次の設定を行うこともできます。 ジェネラコディセタグプレ
セッション用。
これにより、ゼロIDを設定して列をauto_incrementに変更できました。
ゼロは理想的ではありません。また、auto_increment列で使用することもお勧めしません。残念ながら、それは継承されたデータセットの一部であるため、今のところそれで立ち往生しています。
後で設定(およびその他)をクリアするには、次のようにします。 ジェネラコディセタグプレ
ただし、現在のクライアントセッションが終了するとクリアされます。
「NO_AUTO_VALUE_ON_ZERO」設定の詳細
これは、MySQLが適切なauto_increment値を判別できない場合に発生します。あなたの場合、MySQLは次のauto_increment値として1
を選択しますが、その値を持つ行がすでにテーブルにあります。
この問題を解決する1つの方法は、適切なauto_increment値を自分で選択することです。 ジェネラコディセタグプレ
(最後にあるAUTO_INCREMENT=123456
に注意してください。)
編集:それがどのように発生するか正確にはわかりませんが、回避策はあります。
まず、古いテーブルのような新しいテーブルを作成します。 ジェネラコディセタグプレ
次に列を変更します ジェネラコディセタグプレ
新しいデータをダンプします: ジェネラコディセタグプレ
テーブルを移動する: ジェネラコディセタグプレ
破損が発生している可能性がありますが、これで修正されます。
追記:オランダ人として、英語でコーディングすることを強くお勧めします;)
この問題を解決するために私が見つけた最も簡単な方法は、列を変更する前に、まずテーブルのAUTO INCREMENT
値を設定することです。自動インクリメント値を、その列に現在ある最大値よりも高く設定していることを確認してください。
ジェネラコディセタグプレ
これをMySQL5.7でテストしましたが、うまく機能しました。
これは、主キー列にすでに値があるために発生します。
エラーが示すように...
ALTER TABLEにより、auto_incrementの再シーケンスが発生し、キー「PRIMARY」のエントリ「1」が重複します
これは、列にすでに主キー値 1 があり、auto_incrementすると、その列が再割り当てされて重複が発生し、このエラーが発生することを意味します
これに対する解決策は、主要な制限を削除してから列を空にすることです。次に、主キーを設定するテーブルを再度変更します。今回は自動インクリメントを使用します。
同様の問題がありました。問題は、SystemParadoxが指摘したのと同様のID = 0
を含むレコードがテーブルにあることでした。次の手順で問題を処理しました:
手順:
- レコードID0を
x
に更新します。ここでx = MAX(id)+1
- テーブルを変更して主キーと自動インクリメント設定を設定します
- シード値を
x+1
に設定します - レコードID
x
を0
に戻しますコード例: ジェネラコディセタグプレ
このエラーは、複合AUTO_INCREMENT
PRIMARY KEY
を持つMyISAMテーブルがあり、キーを結合しようとしている場合にも発生します
例 ジェネラコディセタグプレ
テーブルが比較的新しく、レコード数が少ない場合は、テーブルを切り捨ててID値をリセットできます。 ジェネラコディセタグプレ
削除を使用しても ID値はリセットされません。 ジェネラコディセタグプレ
テーブルが空になった後、自動インクリメントを適用できます。 ジェネラコディセタグプレ