質問: MySQlで受注テーブル(tbl_order)からバックアップ用の受注テーブル(bk_order)に データを移行するSQLを発行しました。 tbl_orderとbk_orderは全く同じ構成ですが、先頭列のidというフィールドにAUTO_INCREMENTを設定しているため 下記SQLを発行するとエラーになると思ったのですが、実際にSQLを発行するとエラーにならず正常にレコードが追加されました 特に不具合ではないので良いのですが、自分の知識としてAUTO_INCREMENTは無視されるのかはっきりと理解しておきたかったので ご質問させて頂きました。 //対象レコードをバックアップテーブルにコピー INSERT INTO bk_order (SELECT * FROM tbl_order WHERE nouhin_date BETWEEN '2017-01-01' AND '2017-01-31'); //受注テーブルから対象レコードを削除 DELETE FROM tbl_order WHERE nouhin_date BETWEEN '2017-01-01' AND '2017-01-31'; 実行はphpMyAdminで確認しております 宜しくお願い致します。
回答: [MySQL :: MySQL 5.6 リファレンスマニュアル :: 3.6.9 AUTO_INCREMENT の使用](https://dev.mysql.com/doc/refman/5.6/ja/example-auto-increment.html "MySQL :: MySQL 5.6 リファレンスマニュアル :: 3.6.9 AUTO_INCREMENT の使用") AUTO_INCREMENTを設定したカラムに直接値を指定してINSERT INTO文を実行することは出来ますが、 > > InnoDB テーブルでは、一連の INSERT ステートメントの途中で自動インクリメント値を含むカラムを修正する場合は注意が必要です。たとえば、UPDATE ステートメントを使用して、自動インクリメントカラムに新しくより大きい値を入れると、後続の INSERT は「重複」エラーになる場合があります。DELETE を実行したあとでさらに INSERT ステートメントが続く場合、またはトランザクションを COMMIT したが UPDATE ステートメントのあとではない場合に、自動インクリメント値がすでに存在するかどうかのテストが行われます。 > > > ってあるので注意。 INSERT文実行後に、自動インクリメント値の調整をしてあげると良いのではないかと。