6

次の形式のエラーが表示されるのはなぜですか。

Error in query: Duplicate entry '10' for key 1

...次のような INSERT ステートメントを実行する場合:

INSERT INTO wp_abk_period (pricing_id, apartment_id) VALUES (13, 27)

... 13 と 27 は既存の行の有効な IDpricingapartmentあり、テーブルは次のように定義されます。

CREATE TABLE `wp_abk_period` (
  `id` int(11) NOT NULL auto_increment,
  `apartment_id` int(11) NOT NULL,
  `pricing_id` int(11) NOT NULL,
  `type` enum('available','booked','unavailable') collate utf8_unicode_ci default NULL,
  `starts` datetime default NULL,
  `ends` datetime default NULL,
  `recur_type` enum('daily','weekly','monthly','yearly') collate utf8_unicode_ci default NULL,
  `recur_every` char(3) collate utf8_unicode_ci default NULL,
  `timedate_significance` char(4) collate utf8_unicode_ci default NULL,
  `check_in_times` varchar(255) collate utf8_unicode_ci default NULL,
  `check_out_times` varchar(255) collate utf8_unicode_ci default NULL,
  PRIMARY KEY  (`id`),
  KEY `fk_period_apartment1_idx` (`apartment_id`),
  KEY `fk_period_pricing1_idx` (`pricing_id`),
  CONSTRAINT `fk_period_apartment1` FOREIGN KEY (`apartment_id`) REFERENCES `wp_abk_apartment` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_period_pricing1` FOREIGN KEY (`pricing_id`) REFERENCES `wp_abk_pricing` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

key 1 idこの場合、auto_increment指定できないほどオンになっているのではないでしょうか。

注: に未使用の値を指定しただけでは、id問題INSERT INTO wp_abk_period (id, pricing_id, apartment_id) VALUES (3333333, 13, 27)なく動作しますが、再度設定されているauto_incrementため、これを行う必要はありません。


注 2: OK、これは完全な「トワイライト ゾーン」の瞬間です。したがって、上記のクエリを の膨大な数で実行した後、id正常に動作し始め、それ以上は動作しなくなりduplicate entry errorsました。この奇妙な動作を生成するためにMySQLが行っていたWTFを誰かが説明できますか?

4

5 に答える 5

14

テーブルの AUTO_INCREMENT 値とid列の実際の値がうまくいかない可能性があります。

これは役立つかもしれません:

ステップ 1 - テーブルから最大 ID を取得する

select max(id) from wp_abk_period

ステップ 2 - テーブルの AUTO_INCREMENT カウンターを揃える

ALTER TABLE wp_abk_period AUTO_INCREMENT = <value from step 1 + 100>;

ステップ 3 - 挿入を再試行する

なぜAUTO_INCREMENTがうまくいかなくなったのかはわかりません。データがテーブルにあった後に auto_increment を追加しましたか? データがテーブルに挿入された後に auto_increment 値を変更しましたか?

それが役に立てば幸い。

于 2013-02-14T10:21:26.043 に答える
3

次のコマンドを使用して、auto_increment の現在の値を確認できます。

show table status

次に、id の最大値を確認し、それが正しいかどうかを確認します。テーブルの auto_increment 値を変更しない場合。

于 2013-02-14T10:25:01.327 に答える
0

この問題をデバッグするときは、テーブル名の大文字と小文字の区別を確認してください(特に Windows 以外で MySql を実行する場合)。たとえば、あるスクリプトが「CREATE TABLE my_table」に大文字を使用し、別のスクリプトが「INSERT INTO MY_TABLE」を試行した場合。これら 2 つのテーブルの内容とファイル システムの場所が異なる可能性があるため、説明した問題が発生する可能性があります。

于 2015-11-26T00:59:20.310 に答える