SELECTを使用して同じSQLで自動ID値を取得するための最良の方法は何ですか?
フォーラムは、これを「; has Return Scope_Identity()
」と追加すると述べました
SQLの最後はASPで機能します。
PHPに対応する方法はありますか?
データベースサーバーによって異なります。 MySQLを使用して、挿入クエリの直後に mysql_insert_id()
を呼び出します。 PostgreSQLを使用して、最初にシーケンスで " select nextval(seq)
"をクエリし、挿入クエリにキーを含めます。
別のリクエストがレコードを同時に挿入すると、「select max(id) + 1 from tbl
」のクエリが失敗する可能性があります。
Postgresでの最善の方法は、次のようなことを行うことです。
insert into foos(name) values ('my_foo') returning id;
使用しているデータベースエンジンによって異なります。 Firebird などの一部のDBMSには、クエリに追加できるRETURNING句があります。たとえば、IDという名前の自動インクリメント列を持つTABLE1という名前のテーブルがある場合、次のように使用できます。
insert into TABLE1(columns...) values (values...) returning ID;
また、通常のselectステートメントと同じように、挿入されたIDを返します。
Microsoft Transact SQLでは、@@ IDENTITYを使用できます。
例えば.
DECLARE @Table TABLE ( col0 INT IDENTITY, col1 VARCHAR(255), col2 VARCHAR(255))
INSERT INTO @Table (col1, col2) VALUES ('Hello','World!')
SELECT @@Identity
SELECT * FROM @Table
Phpの場合:mysql_insert_id() http://us3.php.net/mysql_insert_id
または
MySql選択クエリから数値を生成したい場合は、これを使用できますEDIT:
SELECT LAST_INSERT_ID(`1`) + 1 FROM table
非常に注意してください:どうやらselect nextval(seq)は高い同時実行性では機能しません-挿入した時間とselect nextval(seq)を呼び出した時間の間に他の接続が挿入される可能性があります。このようなコードは、常に同時実行性の高いテストハーネスでテストしてください。
SQL Serverでは、selectステートメントを使用した挿入には、ID値と、どのIDがどのレコードに送られるかを識別するために必要なその他の列を返す出力句を含めることができます。 values句を使用している場合は、挿入の直後にselect scope_identity()を使用します。