Comment puis-je obtenir la valeur suivante qui sera utilisé sur une colonne d'IDENTITÉ
Je suis de l'utilisation de DB2 v9 sur LUW.
J'ai une colonne définie comme ceci:
"ID" BIGINT NOT NULL GENERATED BY DEFAULT
AS IDENTITY (START WITH 1, INCREMENT BY 1, CACHE 20,
NO MINVALUE, NO MAXVALUE, NO CYCLE, NO ORDER),
Je voudrais savoir la meilleure façon de déterminer la valeur suivante sera de la colonne ID prochaine fois qu'un enregistrement est inséré dans la table.
Je vais utiliser cette information pour écrire un script pour faire une "santé mentale" case sur la table que l'IDENTITÉ est toujours intacte, et que sa valeur est supérieure à la valeur la plus élevée dans la colonne ID.
Je ne veux pas juste de réinitialiser la valeur à l'aveuglette. Si la table ne passe pas le test de cohérence, je veux être informé afin que je puisse déterminer la cause de l'IDENTITÉ de "wacked".
OriginalL'auteur Michael Potter | 2010-03-16
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas déterminer l'identité suivante. Même si vous pourriez vous courez le risque de les données en cours de synchronisation par le temps que vous essayez de créer un nouvel enregistrement. La seule chose à faire est de créer un nouvel enregistrement et obtenir la nouvelle identité, faire votre chèque, et ensuite mettre à jour l'enregistrement avec le reste des données.
Vous pouvez utiliser SÉLECTIONNEZ IDENT_CURRENT('yourtablename') pour obtenir la dernière généré. Cela a le même inconvénient que celui ci-dessus. Qui travaille en T-SQL, vous ne savez pas dans DB2 saveur.
Votre idée de création d'un nouveau dossier de travail. Je ne veux pas remplir le dossier. C'est juste une case et ne sont pas impliquées dans la création de dossiers. J'ai pu créer un nouvel enregistrement, obtenir la valeur de l'identifier colonne, puis faites un retour en arrière. Personne ne sait si faire une restauration a également fait un rollback sur la valeur de départ? Je préfère ne pas avoir une valeur de semences incrémenter chaque fois que je lance le test.
C'est le chemin à parcourir. Ne vous inquiétez pas sur les lacunes. Même avec un entier 32 bits non signé, vous pouvez insérer 1000 lignes par seconde, 24 heures par jour, pour 136 ans avant de ressortir.
OriginalL'auteur ddill65
Je ne pense pas que cela va fonctionner comme prévu. Considérons le cas où une ligne est insérée, puis, avant qu'une autre ligne est insérée, cette ligne est supprimée. À ce stade, l'généré automatiquement le code d'identification (au moins) 2 supérieure à la valeur la plus élevée dans la DB ET il sera correct. Si vous pouvez garantir que personne ne supprime lieu, il pourrait fonctionner, mais je ne suis pas sûr de ce que serait.
Essentiellement, vous êtes vérifier si les opérations de base de la DB logiciel sont de travail et, s'ils ne le sont pas, qu'allez-vous faire? Changer de fournisseur?
Si l'affaire est que vous voulez tout simplement pour réensemencer la colonne d'identité, puis faire un select max(id) et de réamorcer la colonne dans la même transaction. Vous pouvez être sûr que pas de nouveaux enregistrements sont insérés tandis que la colonne est réamorcée par l'application d'isolation serializable la sémantique de transaction.
donc, ce que vous dites, c'est que quelqu'un pourrait tourner sur l'identité insérer, puis oublier de réamorcer la colonne pour le mettre plus haut que le dernier id qu'ils ont inséré par la suite? Vous pouvez tester cela, simplement en lisant le max id valeur, de faire un insert avec la "validité" des données, la vérification si elle réussit ou échoue et a un id supérieur à celui que vous avez observé, puis en supprimant cette ligne-le tout dans une seule transaction. Ce serait introduire un peu "vide" id dans la séquence, mais permettrait de détecter le type de problème que j'ai décrit.
Oui, c'est le type de problème, je suis en train d'essayer de le piéger. J'espère que quelqu'un a une solution qui vous permettra de ne pas créer de vide Id. Ce ne serait pas la fin du monde si j'ai fini avec un vide ID à chaque fois que j'ai exécuté le script, mais idéalement, je voudrais l'éviter.
OriginalL'auteur tvanfosson
Si l'ID de la colonne est définie GÉNÉRÉS PAR TOUJOURS, vous n'aurait pas un problème avec la charge incorrecte/importer. Aussi, IDENTITY_VAL_LOCAL fonction peut être utilisée pour obtenir la valeur d'identité.
Plus sur cette fonction, ici
OriginalL'auteur Peter