
last_insert_row_id는 SQLite3::Database 객체가 마지막으로 실행된 INSERT, UPDATE, REPLACE, DELETE 쿼리의 ROWID를 반환합니다.
last_insert_row_id가 -1을 반환하는 경우는 다음과 같습니다.
- 마지막으로 실행된 쿼리가 INSERT, UPDATE, REPLACE, DELETE가 아닌 경우
- 마지막으로 실행된 쿼리가 ROWID를 사용하지 않는 테이블에 대한 경우
- 마지막으로 실행된 쿼리가 ROWID를 사용하는 테이블에 대한 UPDATE, REPLACE, DELETE 쿼리인 경우
- 마지막으로 실행된 쿼리가 트랜잭션 내에서 실행된 경우 (트랜잭션을 커밋하지 않은 경우)
이러한 경우를 피하기 위해, INSERT 쿼리 이후에 last_insert_row_id를 호출하는 것이 좋습니다.
또한, SQLite3::Database 객체를 사용할 때는 트랜잭션을 사용하는 경우, 트랜잭션을 커밋한 후에 last_insert_row_id를 호출해야 합니다.
예를 들어, 다음 코드는 정상적으로 작동합니다.
ruby
require 'sqlite3'
db = SQLite3::Database.new('example.db')
db.execute('BEGIN TRANSACTION')
db.execute('INSERT INTO users (name, email) VALUES (?, ?)', 'john', 'john@example.com')
db.execute('COMMIT')
id = db.last_insert_row_id
puts id
반면에, 다음 코드는 last_insert_row_id가 -1을 반환합니다.
ruby
require 'sqlite3'
db = SQLite3::Database.new('example.db')
db.execute('BEGIN TRANSACTION')
db.execute('INSERT INTO users (name, email) VALUES (?, ?)', 'john', 'john@example.com')
id = db.last_insert_row_id # last_insert_row_id가 -1을 반환합니다.
db.execute('COMMIT')
2025-06-23 00:08