Oracle XE: Auto Increment

T

Tobias Köhler

Ich habe ein Problem beim automatischen Hochzählen des Primary Keys. Es sind zuwenig Werte vorhanden.

Meine Tabelle:
Code:
CREATE TABLE ERP_CLASS
(
	CLASS_ID INT NOT NULL,
	CLASSNAME VARCHAR(20) NOT NULL,
	CONSTRAINT CLASS_PK PRIMARY KEY (CLASS_ID)
);

Meine Sequenz:
Code:
CREATE SEQUENCE ERP_CLASS_SEQ
    MINVALUE 1
    START WITH 1
    INCREMENT BY 1
    NOCACHE;

Mein Trigger:
Code:
CREATE TRIGGER ERP_CLASS_TRIGGER
	BEFORE INSERT
    ON ERP_CLASS FOR EACH ROW
		BEGIN
			SELECT ERP_CLASS_SEQ.NEXTVAL INTO :NEW.CLASS_ID FROM DUAL;
	    END;

Und mein Insert:
Code:
INSERT INTO ERP_CLASS VALUES('FD');
 
Zuletzt bearbeitet von einem Moderator:
SQL:
INSERT INTO erp_class (classname) VALUES ('FD');

Das ist nicht nur guter Stil (explizite Angabe der Spalten, in die Du Wert(e) einfügen willst), sondern in dem Fall auch notwendig.
 
Danke. Jetzt bin ich etwas weiter.... Denn jetzt kommt ne neue Fehlermeldung:
Trigger ist ungültig und konnte nicht neu bestätigt werden

Wenn ich jedoch versuche, den Trigger neu zu erstellen, kommt folgende Meldung:
Trigger ist bereits vorhanden

aber auch:
Ungültige SQL-Anweisung
 
Ok, jetzt hat es geklappt.... Hab am Code nichts geändert.
Bis eben hatte ich ein Eclipse Plugin benutzt(Quantum DB), damit wollte es nicht. Dann habe ich über den Browser dasselbe versucht und es klappt
 
Ok, jetzt hat es geklappt.... Hab am Code nichts geändert.
Bis eben hatte ich ein Eclipse Plugin benutzt(Quantum DB), damit wollte es nicht. Dann habe ich über den Browser dasselbe versucht und es klappt

- Gut hat es geklappt,aber noch ein kleiner Tipp : Ich würde Trigger vermeiden, wenn es geht, und deine ID gleich auch während des Insert - Statements einfügen. Damit ist die gesamte Logik des Prozesses an einem Ort und nicht "irgenwo" in der DB verteilt...


Gruss
 
Ja, das hätte ich natürlich auch gerne... Mit HSQL hatte ich das auch schon mal, nur Oracle ist Neuland für mich. Am liebsten hätte ich natürlich eine Möglichkeit, ohne den Primary Key angeben zu müssen aber dennoch nur die Tabellen habe. Aber für das Problem habe ich nur den Trigger gefunden.... Naja, solange es klappt;)
 
- Gut hat es geklappt,aber noch ein kleiner Tipp : Ich würde Trigger vermeiden, wenn es geht, und deine ID gleich auch während des Insert - Statements einfügen. Damit ist die gesamte Logik des Prozesses an einem Ort und nicht "irgenwo" in der DB verteilt...
Gruss

Prinzipiell sollte man Trigger sicherlich sparsam einsetzen. Eine andere Lösung kommt aber für Autoincrement-Spalten (bei Oracle) nicht in Frage. Wie willst Du über die Anwendung eindeutige Schlüsselwerte generieren? Ein SELECT MAX(id) + 1 FROM tabelle geht jedenfalls nicht...
 
Prinzipiell sollte man Trigger sicherlich sparsam einsetzen. Eine andere Lösung kommt aber für Autoincrement-Spalten (bei Oracle) nicht in Frage. Wie willst Du über die Anwendung eindeutige Schlüsselwerte generieren? Ein SELECT MAX(id) + 1 FROM tabelle geht jedenfalls nicht...

- Upps, du hast mich glaube ich etwas falsch verstanden :). Natürlich würde ich auch Sequenzen verwenden, um den Key zu generieren. Aber ich würde diesen Wert nicht über einen Trigger in die Tabelle speichern, sondern dort, wo auch der restlich Teil der Speicherlogik sitzt. Wir haben alle unsere Datenzugriffe (Insert/Update/Read) über PL/SQL Packages gekapselt, und genau dort werden auch die Sequences, bei Bedarf abgegriffen



Gruss
 
Zurück