MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでAUTO_INCREMENTを現在のシーケンス番号より小さい値に変更するとどうなる?

MySQLのAUTO_INCREMENTの基本動作

MySQLのカラムにAUTO_INCREMENTを設定すると、シーケンス番号はデフォルト値の1、またはユーザーが指定した値から昇順に自動的に増加していきます。

この仕組みのため、MySQLでは現在のシーケンス番号より小さい値へAUTO_INCREMENTを変更することは事実上できません。ただし重要なのは、そのような変更を試みてもエラーや警告は一切返されず、指定した値が単に無視されるという点です。以下の例で具体的な動作を確認してみましょう。

例:小さい値への変更を試みた場合

ここでは「emp1」というテーブルを使用します。テーブル作成時にAUTO_INCREMENTの初期値を100に設定しているため、データ挿入後は100から連番が始まります。次のクエリの出力結果をご覧ください。

mysql> Select * from emp1;
+-----+---------+
| id | NAME |
+-----+---------+
| 100 | Sohan |
| 101 | Harshit |
+-----+---------+
2 rows in set (0.00 sec)

次に、ALTER TABLE文を使ってAUTO_INCREMENTの値を90に変更してみます。このクエリ自体は構文的に正しいため、MySQLはエラーも警告も返しません。しかし、新しい行を挿入すると、MySQLは指定されたAUTO_INCREMENT値(90)と現在のシーケンス番号(101)を比較します。指定値が現在のシーケンス番号より小さいため、新しい行には102から連番が採番されます。

mysql> ALTER TABLE EMP1 AUTO_INCREMENT = 90;
Query OK, 2 rows affected (0.31 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> Insert into emp1(name) values('Aryan');
Query OK, 1 row affected (0.08 sec)

mysql> Select * from emp1;
+-----+---------+
| id | NAME |
+-----+---------+
| 100 | Sohan |
| 101 | Harshit |
| 102 | Aryan |
+-----+---------+
3 rows in set (0.00 sec)

例:大きい値への変更を行った場合

一方、現在のシーケンス番号より大きい値にAUTO_INCREMENTを変更した場合は、MySQLは指定された値から新しい連番を採番します。

同じ「emp1」テーブルで、AUTO_INCREMENTの値を現在のシーケンス番号より大きい108に変更してみます。すると、新しく挿入された行には指定値である108以降の番号が割り当てられます。

mysql> ALTER TABLE EMP1 AUTO_INCREMENT = 108;
Query OK, 3 rows affected (0.30 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> Insert into emp1(name) values('Daksh');
Query OK, 1 row affected (0.04 sec)

mysql> Insert into emp1(name) values('Yashraj');
Query OK, 1 row affected (0.06 sec)

mysql> Select * from emp1;
+-----+---------+
| id | NAME |
+-----+---------+
| 100 | Sohan |
| 101 | Harshit |
| 102 | Aryan |
| 108 | Daksh |
| 109 | Yashraj |
+-----+---------+
5 rows in set (0.00 sec)

まとめ

AUTO_INCREMENTの値を現在のシーケンス番号より小さい値に変更しても、MySQLはエラーや警告を返さず、その指定は黙って無視されます。実際の挿入時には引き続き現在の最大値+1から採番されます。逆に、大きい値を指定した場合は、その指定値から連番が始まります。この動作を理解しておくことで、意図しないIDの欠番や採番ミスを防ぎ、テーブル設計や運用をより安全に行うことができます。

  1. 【MySQL】STR_TO_DATEを使ってAdmissionDateが現在の日付より前のレコードを比較・抽出する方法

    はじめに MySQLでは、文字列として保存された日付データと現在の日付を比較したいケースがあります。本記事では、STR_TO_DATE()関数を使って文字列形式の日付を日付型に変換し、CURDATE()で取得した現在の日付と比較する方法を、具体的なサンプルコードとともに解説します。 テーブルの作成 まず、サンプル用のテーブルを作成します。ここでは、AdmissionDate列をvarchar(50)型として定義しています。 mysql> create table DemoTable ( AdmissionDate varchar(50) ); Query OK, 0 rows

  2. MySQLで現在の日付より前の日付データを抽出する方法

    MySQLでは、NOW() 関数と比較演算子を使うことで、現在の日時より前の日付を持つレコードを簡単に抽出できます。この記事では、実際にテーブルを作成し、サンプルデータを登録したうえで、現在日時より過去の日付レコードを取得する手順を解説します。 1. サンプルテーブルの作成 まず、日付型(DATETIME)のカラムを持つテーブルを作成しましょう。 mysql> create table DemoTable1877 ( DueDate datetime ); Query OK, 0 rows affected (0.00 sec) 2. テストデータの挿入 次に、IN