SQLite 테이블에서 마지막 자동 증가 ID를 검색하는 방법은 무엇입니까?
열 ID (기본 키, 자동 증가) 및 콘텐츠 (텍스트)가있는 테이블 메시지가 있습니다.
사용자 이름 (기본 키, 텍스트) 및 해시 열이있는 사용자 테이블이 있습니다.
한 발신자 (사용자)가 여러 수신자 (사용자)에게 메시지를 보내고 수신자 (사용자)는 여러 메시지를 가질 수 있습니다.
MessageID (MessageID (메시지 테이블의 ID 열 참조) 및 Recipient (Users 테이블의 사용자 이름 열 참조)) 열이있는 Messages_Recipients 테이블을 생성했습니다.이 테이블은 수신자와 메시지 간의 다 대다 관계를 나타냅니다.
그래서 제가 가진 질문은 이것입니다. 새 메시지의 ID는 데이터베이스에 저장된 후 생성됩니다. 하지만이 새 MessageID를 검색하기 위해 방금 추가 한 MessageRow에 대한 참조를 어떻게 보유 할 수 있습니까?
물론 마지막으로 추가 된 행을 데이터베이스에서 항상 검색 할 수 있지만 다중 스레드 환경에서 다른 행을 반환 할 수 있습니까?
편집 : SQLite에 대해 이해하면 SELECT last_insert_rowid()
. 그러나 ADO.Net에서이 문을 어떻게 호출합니까?
내 지속성 코드 (messages 및 messagesRecipients는 DataTables) :
public void Persist(Message message)
{
pm_databaseDataSet.MessagesRow messagerow;
messagerow=messages.AddMessagesRow(message.Sender,
message.TimeSent.ToFileTime(),
message.Content,
message.TimeCreated.ToFileTime());
UpdateMessages();
var x = messagerow;//I hoped the messagerow would hold a
//reference to the new row in the Messages table, but it does not.
foreach (var recipient in message.Recipients)
{
var row = messagesRecipients.NewMessages_RecipientsRow();
row.Recipient = recipient;
//row.MessageID= How do I find this??
messagesRecipients.AddMessages_RecipientsRow(row);
UpdateMessagesRecipients();//method not shown
}
}
private void UpdateMessages()
{
messagesAdapter.Update(messages);
messagesAdapter.Fill(messages);
}
SQL Server를 사용하면 현재 프로세스에 대한 마지막 ID 값을 가져 오기 위해 SCOPE_IDENTITY ()를 선택합니다.
SQlite를 사용하면 자동 증가를 할 수 있습니다.
SELECT last_insert_rowid()
삽입 직후.
http://www.mail-archive.com/sqlite-users@sqlite.org/msg09429.html
이 값을 얻으려면 귀하의 의견에 대한 답변으로 다음과 같은 SQL 또는 OleDb 코드를 사용하고 싶을 것입니다.
using (SqlConnection conn = new SqlConnection(connString))
{
string sql = "SELECT last_insert_rowid()";
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
int lastID = (Int32) cmd.ExecuteScalar();
}
또 다른 옵션은 시스템 테이블을 보는 것 sqlite_sequence
입니다. 자동 증가 기본 키로 테이블을 생성하면 sqlite 데이터베이스에 자동으로 해당 테이블이 있습니다. 이 테이블은 sqlite가 autoincrement 필드를 추적하여 일부 행을 삭제하거나 일부 삽입이 실패한 후에도 기본 키를 반복하지 않도록하기위한 것입니다 (여기 http://www.sqlite.org/autoinc .html ).
따라서이 테이블을 사용하면 다른 항목을 삽입 한 후에도 새로 삽입 된 항목의 기본 키를 찾을 수 있다는 추가 이점이 있습니다 (물론 다른 테이블에서!). 삽입이 성공했는지 확인한 후 (그렇지 않으면 거짓 번호가 표시됨) 다음을 수행하면됩니다.
select seq from sqlite_sequence where name="table_name"
I've had issues with using SELECT last_insert_rowid()
in a multithreaded environment. If another thread inserts into another table that has an autoinc, last_insert_rowid will return the autoinc value from the new table.
Here's where they state that in the doco:
If a separate thread performs a new INSERT on the same database connection while the sqlite3_last_insert_rowid() function is running and thus changes the last insert rowid, then the value returned by sqlite3_last_insert_rowid() is unpredictable and might not equal either the old or the new last insert rowid.
That's from sqlite.org doco
Sample code from @polyglot solution
SQLiteCommand sql_cmd;
sql_cmd.CommandText = "select seq from sqlite_sequence where name='myTable'; ";
int newId = Convert.ToInt32( sql_cmd.ExecuteScalar( ) );
According to Android Sqlite get last insert row id there is another query:
SELECT rowid from your_table_name order by ROWID DESC limit 1
'development' 카테고리의 다른 글
Jekyll의 마크 다운 코드 블록 내에서 이중 중괄호 이스케이프 (0) | 2020.10.28 |
---|---|
( 'abc')의 'a'가 True이고 [ 'abc']의 'a'가 False 인 이유는 무엇입니까? (0) | 2020.10.28 |
간단한 PHP 페이지 매김 스크립트 (0) | 2020.10.28 |
symfony2에서 일부 클래스의 인스턴스가 아닌지 확인하는 방법 (0) | 2020.10.28 |
django 템플릿 표시 항목 값 또는 빈 문자열 (0) | 2020.10.28 |