59

「Id」(PK)、「KlantId」、「Datum」、「BestellingsTypeId」の4つの列を持つテーブル「Bestelling」があります。ここで、列Idをauto_incrementにしますが、これを実行しようとすると、このエラーが発生します:

ERROR 1062: ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '1' for key 'PRIMARY'

SQL Statement:

ALTER TABLE `aafest`.`aafest_bestelling` CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT



ERROR: Error when running failback script. Details follow.



ERROR 1046: No database selected

SQL Statement:

CREATE TABLE `aafest_bestelling` (

  `Id` int(11) NOT NULL,

  `KlantId` int(11) DEFAULT NULL,

  `Datum` date DEFAULT NULL,

  `BestellingstypeId` int(11) DEFAULT NULL,

  PRIMARY KEY (`Id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1

誰かアイデアがありますか?

4

9 に答える 9

161

これは、テーブルに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を参照してください。

于 2011-06-24T14:58:35.873 に答える
45

1つの行の値が0であるauto_incrementに列を変換しようとしたときにも、この問題が発生しました。0の値を一時的に変更する代わりに、次の設定を行うこともできます。

SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO';

セッションのために。

これにより、ゼロIDを設定して列をauto_incrementに変更できました。

ゼロは理想的ではありません。また、auto_increment列で使用することもお勧めしません。残念ながら、それは継承されたデータセットの一部であるため、私は今のところそれで立ち往生しています。

後で設定(およびその他)をクリアするのに最適です:

SET SESSION sql_mode='';

ただし、現在のクライアントセッションが終了するとクリアされます。

'NO_AUTO_VALUE_ON_ZERO'設定の詳細については、こちらをご覧ください。

于 2012-02-28T15:37:54.703 に答える
23

これは、MySQLが適切なauto_increment値を判別できない場合に発生します。あなたの場合、MySQL1は次のauto_increment値として選択しますが、テーブルにはその値を持つ行がすでにあります。

この問題を解決する1つの方法は、適切なauto_increment値を自分で選択することです。

ALTER TABLE ... CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 123456;

(最後に注意してくださいAUTO_INCREMENT=123456。)

于 2014-12-11T10:07:33.770 に答える
14

この問題を解決するために私が見つけた最も簡単な方法はAUTO INCREMENT、列を変更する前にまずテーブルの値を設定することです。自動増分値を、その列に現在ある最大値よりも高く設定していることを確認してください。

ALTER TABLE `aafest`.`aafest_bestelling` 
AUTO_INCREMENT = 100, 
CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT

私はこれをMySQL5.7でテストしましたが、うまくいきました。

于 2016-04-24T21:06:17.460 に答える
13

編集:それがどのように発生するか正確にはわかりませんが、回避策はあります。

まず、古いテーブルのような新しいテーブルを作成します。

CREATE TABLE aafest_bestelling_new LIKE aafest_bestelling;

次に、列を変更します

ALTER TABLE `aafest`.`aafest_bestelling_new` 
CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT

新しいデータをダンプします。

INSERT INTO aafest_bestelling_new
 (KlantId, Datum, BestellingTypeId) 
SELECT 
KlantId, Datum, BestellingTypeId 
FROM aafest_bestelling;

テーブルを移動します。

RENAME TABLE 
aafest_bestelling TO aafest_bestelling_old, 
aafest_bestelling_new TO aafest_bestelling;

おそらく、いくつかの破損が発生しており、これでそれも修正されます。

PS:オランダ人として、私は英語でコーディングすることを強くお勧めします;)

于 2011-03-23T09:14:53.563 に答える
3

同様の問題がありました。ID = 0問題は、 SystemParadoxが指摘したのと同様のレコードがテーブルにあることでした。次の手順で問題を処理しました。

手順:

  1. xレコードID0を次の場所に更新しますx = MAX(id)+1
  2. テーブルを変更して、主キーと自動増分設定を設定します
  3. シード値をx+1
  4. レコードIDxをに戻します0

コード例:

UPDATE foo SET id = 100 WHERE id = 0;
ALTER TABLE foo MODIFY COLUMN id INT(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE foo AUTO_INCREMENT = 101;
UPDATE foo SET id = 0 WHERE id = 100;
于 2018-04-10T21:54:28.113 に答える
2

これは、主キー列にすでに値があるために発生します。

エラーが言うように...

ALTER TABLEにより、auto_incrementの再シーケンスが発生し、キー「PRIMARY」のエントリ「1」が重複します。

これは、列にすでに主キー値1があり、auto_incrementすると、その列が再割り当てされて重複が発生し、このエラーが発生することを意味します。

これに対する解決策は、プライマリ制約を削除してから、列を空にすることです。次に、主キーを設定するテーブルを再度変更します。今回は自動インクリメントを使用します。

于 2014-04-03T12:14:57.197 に答える
2

このエラーは、anyテーブルにIDが0(または負)の既存のレコードが含まれているために発生します。正の値を使用するように既存のすべてのレコードを更新すると、その列にauto_incrementを設定できるようになります。これが機能しなかった場合は、すべてのデータをエクスポートしてコンピューター内の任意の場所に保存し、最初に外部キー関係を作成してから、親テーブルにデータを入力しないでください。

于 2020-09-11T10:07:43.353 に答える
0

AUTO_INCREMENT PRIMARY KEYこのエラーは、コンポジットを含むMyISAMテーブルがあり、キーを結合しようとしている場合にも発生します。

例えば

CREATE TABLE test1(
 `id` int(11)NOT NULL、
 `ver` int(10)unsigned NOT NULL AUTO_INCREMENT、
主キー( `id`、` ver`)
)ENGINE = MyISAM DEFAULT CHARSET = utf8;

INSERT INTO test1( `id`、` ver`)VALUES(1、NULL)、(1、NULL)、(1、NULL)、(2、NULL)、(2、NULL)、(2、NULL);

ALTER TABLE test1 DROP PRIMARY KEY、ADD PRIMARY KEY( `ver`);
于 2014-03-10T09:47:39.303 に答える