Question

Quel est le moyen le plus efficace d’obtenir la valeur de la colonne SERIAL après l’instruction INSERT? C'est à dire. Je recherche un moyen de répliquer les fonctionnalités @@ IDENTITY ou SCOPE_IDENTITY de MS SQL

Était-ce utile?

La solution

La valeur de la dernière insertion SERIAL est stockée dans l'enregistrement SQLCA, en tant que deuxième entrée du tableau sqlerrd. La réponse de Brian est correcte pour ESQL / C, mais vous n'avez pas indiqué quelle langue vous utilisez.

Si vous écrivez une procédure stockée, la valeur peut être trouvée ainsi:

LET new_id = DBINFO('sqlca.sqlerrd1');

Vous pouvez également le trouver dans $ sth- > {ix_sqlerrd} [1] si vous utilisez DBI

Il existe des variantes pour d'autres langages / interfaces, mais je suis sûr que vous aurez l'idée.

Autres conseils

J'ai vu cela utilisé.

if LOCAL_SQLCA^.sqlcode = 0 then
/ return serial */
  Result := LOCAL_SQLCA^.sqlerrd[1]
else
/* return error code */
  Result := -(Abs(LOCAL_SQLCA^.sqlcode));

Je ne pense pas "efficace" est le mot que vous recherchez ici. C'est plus une question de précision. Je ne suis pas sûr de pouvoir l'expliquer plus efficacement que le SQL Books Online, mais généralement, à moins que vous ne sachiez vraiment ce que vous faites et que vous ayez une raison spécifique d'utiliser @@ IDENTITY, utilisez SCOPE_IDENTITY. La raison la plus évidente est que @@ IDENTITY ne retournera pas l’identité du dernier enregistrement ajouté par votre programme / sp / etc s’il existe un déclencheur attaché à la table. En outre, il pourrait y avoir des problèmes dans les applications à volume élevé où deux transactions sont effectuées en même temps et où les suivantes se produiraient ...

  1. Votre insertion
  2. insertion d'un autre utilisateur
  3. vous renvoyer l'identité d'un autre utilisateur

L'OP n'a pas spécifié quelle version d'Informix est utilisée, il peut donc y avoir différentes réponses

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top