web-dev-qa-db-ja.com

SQL-行を挿入して主キーを返す

私は少し機知に富んだ問題を抱えています。たとえば、主キーが存在するテーブルにいくつかのデータを含む行を挿入しました。挿入された行の主キーをどのように「選択」しますか?

もっと具体的で、現在SQLiteを使用していることに言及する必要がありました。

27
Samuel Moriarty

MS SQL Serverの場合:

SCOPE_IDENTITY() は、現在のスコープ内で最後に生成されたID値を返します。

SELECT SCOPE_IDENTITY() AS NewID
50

SQL Server 2005以降では、主キーのタイプに関係なく、常に OUTPUT を使用して、挿入された値を返すことができます。

INSERT INTO dbo.YourTable(col1, col2, ...., colN)
OUTPUT Inserted.PrimaryKey
VALUES(val1, val2, ....., valN)
33
marc_s

MySQLの場合、LAST_INSERT_ID()を使用します

http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

また、トランザクションを開始し、行を挿入し、挿入したばかりの一意の値(タイムスタンプやGUIDなど)を持つフィールドを使用して行を選択できる必要があります。行を選択するための適切な一意フィールドがある限り、これはトランザクションをサポートするほとんどすべてのRDBMSで機能するはずです。

6
Dagg Nabbit

SQLサーバー:

@@IDENTITYを使用できます。 insertステートメントの後、次を実行できます。

select @@identity

これにより、挿入したレコードの主キーが得られます。後で使用する予定がある場合は、保存することをお勧めします。

set @MyIdentity = @@identity

ストアドプロシージャでこれを使用していて、アプリケーションで再度アクセスしたい場合は、nocount offを忘れないようにしてください。

6
Farhan

テーブルにトリガーがあるときにMS SQLで新しいインデックスを取得する必要がある場合は、少しの回避策を使用する必要があります。単純なOUTPUTは機能しません。あなたはこのようなことをしなければなりません(VB.NETで):

DECLARE @newKeyTbl TABLE (newKey INT);
INSERT INTO myDbName(myFieldName) OUTPUT INSERTED.myKeyName INTO @newKeyTbl VALUES('myValue'); " & _
SELECT newKey FROM @newKeyTbl;"

.NETを使用している場合、このクエリからの戻り値を直接整数にキャストできます(戻り値を取得するには、.NET SqlCommandで「ExecuteScalar」を呼び出す必要があります)。

3
Ian

SQLiteの場合:

SELECT [Column_1],  [Column_2],...  [Column_n]
FROM [YourTable]
WHERE rowid = (SELECT last_insert_rowid())

whereas

  • Column_1Column_2、...Column_n:は主キーYourTable

作成した場合YourTable置換された主キーrowid(つまり、1つの列pkはINTEGER PRIMARY KEY)を使用するだけです:

SELECT last_insert_rowid()

これは一般的なケースです。
最後に、これはWITHOUT_ROWIDテーブルでは機能しません。

チェックしてください:

https://www.sqlite.org/lang_corefunc.html#last_insert_rowid

0
Esau

Postgresqlの場合:

SELECT CURRVAL(pg_get_serial_sequence('schema.table','id'))

ソース: https://stackoverflow.com/questions/2944297/postgresql-function-for-last-inserted-id

0
z-index