Domanda

In Interbase (sto usando 2007, non so se è importante) c'è un comando per ottenere l'identità di un record appena inserita, simile a SCOPE_IDENTITY () in SQL Server?

È stato utile?

Soluzione

No, InterBase non hanno davvero una caratteristica identità.

Cosa InterBase ha, invece, è una caratteristica del generatore. I generatori sono un po 'come l'identità, ma sono logicamente separate dalla colonna chiave primaria. Un generatore, in altre parole, vi darà un valore unico garantito, ma che cosa fare con quel valore dipende da te.

Si potrebbe utilizzare tale valore come i valori di chiave primaria per una singola tabella, o per più tabelle. Ma in realtà l'assegnazione del valore della chiave primaria è qualcosa che si deve fare da soli.

Oltre a non avere una caratteristica come SCOPE_IDENTITY, InterBase non ha alcun tipo di funzione per restituire i valori da un'istruzione INSERT. Quindi non solo si può non ottenere un back valore della chiave primaria generata da una dichiarazione INSERT, anche voi non può ottenere tutti gli altri valori, come ad esempio i valori fissati da un trigger.

Soluzioni alternative

Una soluzione possibile per questo è di generare il valore della chiave primaria in anticipo. Così si potrebbe fare qualcosa di simile alla seguente (ho intenzione di utilizzare Interbase immagazzinata sintassi procedura per questo esempio, dal momento che non so cosa linguaggio di programmazione che si sta utilizzando, ma si può fare la stessa cosa in qualsiasi linguaggio di programmazione):

DECLARE VARIABLE ID INTEGER;
BEGIN
    ID = SELECT GEN_ID(MY_GENERATOR, 1) FROM RDB$DATABASE;
    INSERT INTO MY_TABLE (ID, DESCRIPTION) VALUES (:ID, "Foo");

RDB$DATABASE è una tabella di sistema che ha un solo record. Conoscendo il valore di ID, è possibile restituirlo a partire dalla proc.

Una seconda soluzione è SELECT il record utilizzando una chiave alternativa e leggere l'ID generato in questo modo.

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