Informix: come ottenere un ID dell'ultimo record inserito
Domanda
Qual è il modo più efficiente per ottenere il valore della colonna SERIAL dopo l'istruzione INSERT? Cioè Sto cercando un modo per replicare la funzionalità @@ IDENTITY
o SCOPE_IDENTITY
di MS SQL
Soluzione
Il valore dell'ultimo inserto SERIAL è memorizzato nel record SQLCA, come seconda voce nell'array sqlerrd. La risposta di Brian è corretta per ESQL / C, ma non hai menzionato la lingua che stai utilizzando.
Se stai scrivendo una procedura memorizzata, il valore può essere trovato così:
LET new_id = DBINFO('sqlca.sqlerrd1');
Può anche essere trovato in $ sth- > {ix_sqlerrd} [1]
se si utilizza DBI
Esistono varianti per altre lingue / interfacce, ma sono sicuro che avrai l'idea.
Altri suggerimenti
L'ho visto usato.
if LOCAL_SQLCA^.sqlcode = 0 then
/ return serial */
Result := LOCAL_SQLCA^.sqlerrd[1]
else
/* return error code */
Result := -(Abs(LOCAL_SQLCA^.sqlcode));
Non penso che sia "efficiente" è la parola che stai cercando qui. È più una questione di precisione. Non sono sicuro di poter fare un lavoro migliore per spiegarlo di quanto non possa fare la documentazione online di SQL, ma in generale, a meno che tu non sappia davvero cosa stai facendo e abbia un motivo specifico per usare @@ IDENTITY, usi SCOPE_IDENTITY. Il motivo più ovvio di ciò è che @@ IDENTITY non restituirà l'identità dell'ultimo record aggiunto dal programma / sp / etc se è presente un trigger associato alla tabella. Inoltre, potrebbero esserci problemi nelle applicazioni ad alto volume in cui due transazioni si verificano contemporaneamente e si verificherebbe quanto segue ...
- Il tuo inserto
- Inserimento di altri utenti
- Restituisci l'identità di un altro utente a te
L'OP non ha specificato quale versione di Informix viene utilizzata, quindi possono esserci risposte diverse