oracle - wie zu verwenden-Sequenz als auto increment id?
Ich habe eine oracle-Datenbank-Tabelle:
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;
Wenn ich insert 20 Datensätze in die Tabelle mit Datenbank-tool, und dann mit meiner C# - Anwendung zum einfügen von Datensätzen, die dog-id beginnt mit 1, anstatt 21.
Jemand kann mir helfen, diesen Fehler beheben kann?
Dank.
in Ihrem C# - code, dann sind Sie vorbei die Spalte "Id"? ich denke, Sie müssen sein. der trigger ist so codiert, dass nur Feuer (when-Klausel), wenn die ID nicht übergeben. Auch ich würd dir raten es nicht zu verwenden, notiert die Namen in der DB-Objekte.
Ich bin mir nicht sicher, dass ich Folgen Frage. Sind Sie auf der einsetzen die ersten 20 Zeilen, bevor Sie die Auslöser? Sind Sie auf der einsetzen die ersten 20 Zeilen, indem Sie explizit die Angabe einer "Id" - Wert und verhindert somit das auslösen von Brand? Ist dein C# - Programm übergeben Werte für "Id", dass die Ursache der trigger umgangen werden kann (d.h. die übergabe in einem Wert von 1, explizit)?
die ersten 20 Zeilen mit id-Wert. Es gibt keine "Id" - Spalte in meinem c# - code.
In einigen Fällen, brauche ich die genaue Id-Wert, e ist.g: import alte Daten.
was ist die "Datenbank-Tools" erzeugen dann? fügen Sie db side insert-statment + c# - code, wie eine Sequenz ohne Zyklus kann nicht zurück springen und wiederverwenden eine ID, die Sie bereits erzeugt.
Ich bin mir nicht sicher, dass ich Folgen Frage. Sind Sie auf der einsetzen die ersten 20 Zeilen, bevor Sie die Auslöser? Sind Sie auf der einsetzen die ersten 20 Zeilen, indem Sie explizit die Angabe einer "Id" - Wert und verhindert somit das auslösen von Brand? Ist dein C# - Programm übergeben Werte für "Id", dass die Ursache der trigger umgangen werden kann (d.h. die übergabe in einem Wert von 1, explizit)?
die ersten 20 Zeilen mit id-Wert. Es gibt keine "Id" - Spalte in meinem c# - code.
In einigen Fällen, brauche ich die genaue Id-Wert, e ist.g: import alte Daten.
was ist die "Datenbank-Tools" erzeugen dann? fügen Sie db side insert-statment + c# - code, wie eine Sequenz ohne Zyklus kann nicht zurück springen und wiederverwenden eine ID, die Sie bereits erzeugt.
InformationsquelleAutor Rock | 2012-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sequenz ist nicht ein "auto-increment-id".
Sequenz ist nur eine fortlaufende, eindeutige Nummer-generator. Es kann Ihre Arbeit als Id-Spalte-Wert-Anbieter, aber es ist bis tu Sie zu halten, um korrekte Werte in der Spalte.
Ich gehe davon aus, dass Sie Ihre 20 Zeilen wie diese:
Ihre Reihenfolge hat keine Möglichkeit zu wissen, was ist die nächste Zahl, die Sie "erwarten" es zu haben (es sei denn natürlich Sie (wieder)schaffen Sie es mit den gewünschten Anfangswert).
Stattdessen sollten Sie immer die Werte von Ihrer Reihenfolge so:
Diese Weise halten Sie Reihenfolge in Synchronisation mit der Tabellen-id-Werte.
EDIT :
Können Sie imitieren das Verhalten durch die Verwendung von trigger und Sequenz, wie beschrieben in diese Antwort.
Auch die IDENTITY-Spalte ist jetzt verfügbar auf Oracle 12c
Wenn nicht Ihre Gedanken Lesen, ist ein Fehler. Dann ja.
Es klingt wie Sie sagen, Sie können nicht mit einer Sequenz zusammen mit einem trigger, um eine insert -, wirken wie eine auto-increment-Spalte. Das scheint nicht der Fall, z.B. Antwort.
das war nicht meine Absicht. Ich update meine Antwort 🙂
InformationsquelleAutor Grzegorz W
Müssen Sie ändern Ihre Reihenfolge, wenn Sie beginnen möchten, die von 20 statt 1.
Und es scheint, Sie war nicht in der richtigen Reihenfolge in Ihr auslösen.
InformationsquelleAutor Mupmup
Ich denke, dass Sie mit falschen
Seq name
.Anstatt
DOGINFO_SEQ
verwendenUSERINFO_SEQ
.InformationsquelleAutor posix