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

È stato utile?

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 ...

  1. Il tuo inserto
  2. Inserimento di altri utenti
  3. 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top