InnoDB の AUTO_INCREMENT フィールドを取得して、1 ではなく 0 からカウントを開始する方法はありますか
CREATE TABLE `df_mainevent` (
`idDf_MainEvent` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`idDf_MainEvent`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
InnoDB の AUTO_INCREMENT フィールドを取得して、1 ではなく 0 からカウントを開始する方法はありますか
CREATE TABLE `df_mainevent` (
`idDf_MainEvent` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`idDf_MainEvent`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
MySQL のドキュメント:
ユーザーが INSERT の AUTO_INCREMENT カラムに NULL または 0 を指定すると、 InnoDB は値が指定されていないかのように行を扱い、新しい値を生成します。
したがって、0 は NULL に似た「特別な」値であることを意味します。AUTO_INCREMENT = 0 を使用する場合でも、初期値は 1 に設定されます。
MySQL 5.0.3 以降、 InnoDB は CREATE TABLE および ALTER TABLE ステートメントで AUTO_INCREMENT = N テーブル オプションをサポートし、初期カウンター値を設定するか、現在のカウンター値を変更します。このオプションの効果は、このセクションで前述した理由により、サーバーの再起動によってキャンセルされます。
これは InnoDB と MyISAM の両方で機能し、2 番目の挿入は1
not2
です:
CREATE TABLE ex1 (id INT AUTO_INCREMENT PRIMARY KEY) ENGINE=MyISAM;
SET sql_mode='NO_AUTO_VALUE_ON_ZERO';
INSERT INTO ex1 SET id=0;
INSERT INTO ex1 SET id=NULL;
SELECT * FROM ex1;
+----+
| id |
+----+
| 0 |
| 1 |
+----+
2 rows in set (0.00 sec)
CREATE TABLE ex2 (id INT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
SET sql_mode='NO_AUTO_VALUE_ON_ZERO';
INSERT INTO ex2 SET id=0;
INSERT INTO ex2 SET id=NULL;
SELECT * FROM ex2;
+----+
| id |
+----+
| 0 |
| 1 |
+----+
2 rows in set (0.00 sec)
Daren Schwenke のテクニックが機能します。次に挿入されるレコードが 2 になるのは残念です。
たとえば、次のようになります。
CREATE TABLE IF NOT EXISTS `table_name` (
`ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(100) NOT NULL,
PRIMARY KEY( `ID` )
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
INSERT INTO `table_name` (`Name`) VALUES ('Record0?');
UPDATE `table_name` SET `ID`=0 WHERE `ID`=1;
INSERT INTO `table_name` (`Name`) VALUES ('Record1?');
SELECT * FROM `table_name`;
ID Name
0 Record0?
2 Record1?
これは大したことではなく、単に面倒です。
ティム