私は少し機知に富んだ問題を抱えています。たとえば、主キーが存在するテーブルにいくつかのデータを含む行を挿入しました。挿入された行の主キーをどのように「選択」しますか?
もっと具体的で、現在SQLiteを使用していることに言及する必要がありました。
SQL Server 2005以降では、主キーのタイプに関係なく、常に OUTPUT
句 を使用して、挿入された値を返すことができます。
INSERT INTO dbo.YourTable(col1, col2, ...., colN)
OUTPUT Inserted.PrimaryKey
VALUES(val1, val2, ....., valN)
MySQLの場合、LAST_INSERT_ID()を使用します
http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html
また、トランザクションを開始し、行を挿入し、挿入したばかりの一意の値(タイムスタンプやGUIDなど)を持つフィールドを使用して行を選択できる必要があります。行を選択するための適切な一意フィールドがある限り、これはトランザクションをサポートするほとんどすべてのRDBMSで機能するはずです。
SQLサーバー:
@@IDENTITY
を使用できます。 insertステートメントの後、次を実行できます。
select @@identity
これにより、挿入したレコードの主キーが得られます。後で使用する予定がある場合は、保存することをお勧めします。
set @MyIdentity = @@identity
ストアドプロシージャでこれを使用していて、アプリケーションで再度アクセスしたい場合は、nocount offを忘れないようにしてください。
テーブルにトリガーがあるときに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」を呼び出す必要があります)。
SQLiteの場合:
SELECT [Column_1], [Column_2],... [Column_n]
FROM [YourTable]
WHERE rowid = (SELECT last_insert_rowid())
whereas:
作成した場合YourTable置換された主キーrowid(つまり、1つの列pkはINTEGER PRIMARY KEY)を使用するだけです:
SELECT last_insert_rowid()
これは一般的なケースです。
最後に、これはWITHOUT_ROWIDテーブルでは機能しません。
チェックしてください:
Postgresqlの場合:
SELECT CURRVAL(pg_get_serial_sequence('schema.table','id'))
ソース: https://stackoverflow.com/questions/2944297/postgresql-function-for-last-inserted-id