これをテストしたい自動増分フィールドの次の値を知りたい:
select max(contactid) from contact
1を追加しましたが、レコードを1つ挿入して削除すると、たとえば、フィールドが2つ増えると、エラーが発生する可能性があることに気付きました。
どうすればそれを達成できますか?ありがとうございました
これをテストしたい自動増分フィールドの次の値を知りたい:
select max(contactid) from contact
1を追加しましたが、レコードを1つ挿入して削除すると、たとえば、フィールドが2つ増えると、エラーが発生する可能性があることに気付きました。
どうすればそれを達成できますか?ありがとうございました
この問題には複数の解決策があります。
1.(推奨)自動インクリメント値の予測を停止します
これはより一般的なケースであり、基本的には設計どおりに自動インクリメントを使用しています。これは、挿入する前に実際に自動インクリメント値が必要ないことを前提としています。あなたができることは次のとおりです。
DROP TABLE IF EXISTS t;
CREATE TABLE t (id INT UNSIGNED NOT NULL auto_increment, x INT NOT NULL, PRIMARY KEY(id));
INSERT INTO t (x) VALUES (100);
SELECT LAST_INSERT_ID();
を呼び出すとSELECT LAST_INSERT_ID()
、に対して生成されたばかりのIDが返されますINSERT
。
2.IDを生成するために特別にID生成テーブルを設定します
次のように、自動インクリメント列のみを含むテーブルを作成できます。
DROP TABLE IF EXISTS id_generator;
CREATE TABLE id_generator (id INT UNSIGNED NOT NULL auto_increment, PRIMARY KEY(id));
次に、次のコマンドを使用して新しい一意のIDを生成できます。
INSERT INTO id_generator (id) VALUES (NULL);
SELECT LAST_INSERT_ID();
そして、そのIDを使用して、実際に作業しているテーブルに挿入します。生成されたすべてのIDがこのID生成テーブルからのものである限り、競合は発生しません。ただし、これらのIDの生成にはコストがかかり、自動インクリメントはあまり効率的ではありません。
3.外部ID生成スキームを使用します
これはソリューション2とほぼ同じですが、IDの生成にMySQLをまったく使用しません。文字列を生成するUUID/GUIDスキームのようなものを使用することも、Snowflakeのようなものを使用して整数IDを生成することもできます。
LAST_INSERT_ID
次のように使用する必要があります。
SELECT LAST_INSERT_ID()
AUTO_INCREMENT
IDフィールドの最後の値を返します。
詳細はこちら: http: //goo.gl/RkmR5
これにより、挿入される次のID値が得られます。
SELECT LAST_INSERT_ID() + 1;