oracle - comment faire pour utiliser la séquence d'auto-incrément id?
J'ai une table de base de données oracle:
CREATE TABLE "DogInfo" (
"Id" NUMBER NOT NULL ENABLE,
"DogName" VARCHAR2 (50 CHAR) NOT NULL ENABLE,
"DogAge" NUMBER NOT NULL ENABLE,
CONSTRAINT "DogInfo_PK" PRIMARY KEY ("Id") ENABLE
);
CREATE SEQUENCE "DOGINFO_SEQ" MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE;
CREATE OR REPLACE TRIGGER "BI_DogInfo"
BEFORE INSERT ON "DogInfo" FOR EACH ROW
WHEN (NEW."Id" IS NULL OR NEW."Id" = 0) BEGIN
SELECT "USERINFO_SEQ".nextval INTO :NEW."Id" FROM dual;
END;
ALTER TRIGGER "BI_DogInfo" ENABLE;
Si j'insère les 20 dossiers dans le tableau avec outil de base de données, puis utiliser mon C# une application web pour insérer des enregistrements, le chien le code d'identification de commencer à 1, plutôt que de 21.
Quelqu'un peut m'aider à corriger ce bug?
Grâce.
- dans votre code C# alors êtes-vous en passant de la "Id" de la colonne? je suppose que vous devez être. le déclencheur est codé à feu (lorsque la clause) si l'ID n'est pas passé. Aussi je vous conseille de ne pas utiliser cité les noms en DB objets.
- Je ne suis pas sûr que j'ai suivi à la question. Êtes-vous d'insérer les 20 premières lignes avant de créer l'élément déclencheur? Êtes-vous d'insérer les 20 premières lignes en spécifiant explicitement un "Id" de la valeur, donc de prévenir le déclenchement de tir? Est votre application C# en passant dans les valeurs de "Id" qui provoquent le déclenchement de court-circuité (c'est à dire le passage d'une valeur de 1 explicitement)?
- les 20 premières lignes avec la valeur de l'id. Il n'y a pas de "Id" de la colonne dans mon code c#.
- Dans certains cas, j'ai besoin exact de la valeur de l'Id, e de.g: importation des données anciennes.
- qu'est-ce que la "base de données de l'outil de génération alors? coller db insert latéral de tresorerie + code c#, comme une séquence sans cycle ne peut pas sauter en arrière et de réutiliser une ID qu'il a déjà généré.
- Êtes-vous créer toutes les fixe-ID-données de la valeur de la première (c'est à dire l'importation de toutes les anciennes données) et toutes les données seront insérées à partir de votre
c#
code? Ou pour le dire d'une autre façon, est-il clair, propre, coupée de la vieille fixe des valeurs et de la nouvelle auto-incrémentation des valeurs, ou à tout le moins d'un plafond pour les anciennes valeurs? "Normal", façon de le faire serait de créer la séquence une fois que toutes les anciennes données est inséré, avecstart with
basée sur la valeur la plus élevée dans les données importées. La séquence ne peut pas savoir automatiquement sur les valeurs que vous avez définies manuellement.
Vous devez vous connecter pour publier un commentaire.
Séquence n'est pas une "auto increment id".
Séquence est juste un séquentiel unique générateur de nombre. Il peut travailler en tant que votre colonne Id de la valeur de fournisseur, mais il est de tu Vous de garder les bonnes valeurs dans la colonne.
Je suppose que Vous ajoutez votre 20 lignes comme ceci:
Votre séquence a aucun moyen de savoir quel est le prochain numéro de "s'attendre" à avoir (sauf si bien sûr vous (re)créer avec désiré valeur initiale).
Au lieu de cela, Vous devez toujours utiliser les valeurs de votre séquence comme ceci:
De cette façon, vous pourrez suivre la séquence de synchronisation avec le tableau des valeurs d'id.
EDIT :
Vous pouvez imiter ce comportement par l'aide de la gâchette et de la séquence décrite dans cette réponse.
Également de la colonne d'IDENTITÉ est maintenant disponible sur Oracle 12c
Vous avez besoin de changer votre séquence si vous voulez commencer par 20 plutôt que 1.
Et il semble que vous n'avez pas utilisé le bon ordre dans votre déclencheur.
Je pense que vous l'utilisez mal
Seq name
.Au lieu d'utiliser
DOGINFO_SEQ
utilisationUSERINFO_SEQ
.