Eu li sobre especificações. "Retorna: o ID da linha recém-inserida ou -1 se ocorrer um erro" o rowId é igual ao meu campo gerado "id incremento automático da chave primária"?
Marcos Vasconcelos
29
Sim, é a mesma coisa.
GRAND
3
@ GrAnd, mas e se eu excluir algumas linhas "start-middle" da minha tabela, então eu quebro a sequência das n-ésimas linhas com o ID gerado = n. O ID da linha retornada permanecerá o mesmo que o ID de incremento automático gerado?
precisa saber é o seguinte
1
E se você precisar fazer INSERIR OU ATUALIZAR e obter o ID?
Timo
1
@UnknownJoe Eu sei que este é um post antigo. Mas pode ser útil para alguém. O ID da linha e o ID autoincrementado serão os mesmos, mesmo que sejam excluídos do meio.
Raj kannan Iyyappan
8
Se você usar ContentValues:
DBHelper db =newDBHelper();// your dbHelperContentValues values =newContentValues();
values.put("firstName","Ahmad");
values.put("lastName","Aghazadeh");long insertedId= db.getSQLiteDatabase().insert("user","", values);
Se o exec da consulta usar select last_insert_rowid()
String sql ="INSERT INTO [user](firstName,lastName) VALUES (\"Ahmad\",\"Aghazadeh\"); select last_insert_rowid()";DBHelper itemType =newDBHelper();// your dbHelper
c = db.rawQuery(sql,null);if(c.moveToFirst())
result = c.getLong(0);
Eu verifiquei as fontes.
insertO método use sqlite3_last_insert_rowidfunction para retornar um ID. De acordo com a documentação: https://www.sqlite.org/c3ref/last_insert_rowid.html
O ID da linha é a coluna oculta ou uma coluna do tipo, INTEGER PRIMARY KEYse declarada.
Cada entrada na maioria das tabelas SQLite (exceto para WITHOUT ROWIDtabelas) tem um único 64-bit inteiro assinado chave chamada " rowid ". O rowid está sempre disponível como uma coluna não declarada denominada ROWID, OID ou _ROWID_, desde que esses nomes também não sejam usados por colunas declaradas explicitamente. Se a tabela tiver uma coluna do tipoINTEGER PRIMARY KEY , essa coluna será outro alias para o rowid .
Eu tive alguns problemas com isso no mySQL, o LAST_INSERT_ID não é uma maneira confiável de obter o ID. Se você tem usuários martelando o banco de dados, o ID retornado pode não ser o ID inserido pela consulta que você executou, vários outros usuários podem afetar o retorno desse ID. Tínhamos um servidor com média de 7.000 usuários por minuto martelando e ele sempre tropeçava.
A solução que tivemos foi usar dados da consulta inserida e, em seguida, procurar esse resultado usando esses dados. Você está solicitando a última identificação de qualquer maneira. Portanto, você também pode criar uma tabela SELECT id FROM em que field = var e field = var para obter o id. É um leve impacto na consulta, mas um resultado muito mais confiável é retornado.
Se você usar ContentValues:
Se o exec da consulta usar
select last_insert_rowid()
Se usar Sala
fonte
Eu verifiquei as fontes.
insert
O método usesqlite3_last_insert_rowid
function para retornar um ID. De acordo com a documentação: https://www.sqlite.org/c3ref/last_insert_rowid.html O ID da linha é a coluna oculta ou uma coluna do tipo,INTEGER PRIMARY KEY
se declarada.Então essa é a
_ID
coluna padrão normalmentefonte
Eu tive alguns problemas com isso no mySQL, o LAST_INSERT_ID não é uma maneira confiável de obter o ID. Se você tem usuários martelando o banco de dados, o ID retornado pode não ser o ID inserido pela consulta que você executou, vários outros usuários podem afetar o retorno desse ID. Tínhamos um servidor com média de 7.000 usuários por minuto martelando e ele sempre tropeçava.
A solução que tivemos foi usar dados da consulta inserida e, em seguida, procurar esse resultado usando esses dados. Você está solicitando a última identificação de qualquer maneira. Portanto, você também pode criar uma tabela SELECT id FROM em que field = var e field = var para obter o id. É um leve impacto na consulta, mas um resultado muito mais confiável é retornado.
fonte
Pode-se simplesmente obter a última linha inserida _id usando
last_insert_rowid()
. O código de exemplo é como abaixo.fonte