Es scheint, dass es in Oracle bis einschließlich Version 11g kein Konzept für AUTO_INCREMENT gibt.
Wie kann ich eine Spalte erstellen, die sich in Oracle 11g wie ein automatisches Inkrementieren verhält?
sql
oracle
auto-increment
Sushan Ghimire
quelle
quelle
BEFORE INSERT
Trigger für die Tabelle erstellen und Werte aus einer Sequenz ziehen, um ein automatisches Inkrement zu erstellenAntworten:
In Oracle gibt es keine Spalten "auto_increment" oder "identity" Oracle 11g gibt es . Sie können es jedoch einfach mit einer Sequenz und einem Trigger modellieren:
Tabellendefinition:
Triggerdefinition:
AKTUALISIEREN:
IDENTITY
Die Spalte ist jetzt in Oracle 12c verfügbar:oder geben Sie Start- und Inkrementwerte an und verhindern Sie so das Einfügen in die Identitätsspalte (
GENERATED ALWAYS
) (wiederum nur Oracle 12c +).Alternativ kann in Oracle 12 auch eine Sequenz als Standardwert verwendet werden:
quelle
dept_seq
kam!SELECT .. INTO
den Trigger nicht verwenden, den Sie gerade ausführen können:new.id := dept_seq.NEXTVAL;
.SYS_GUID
Gibt eine GUID zurück - eine global eindeutige ID. ASYS_GUID
ist aRAW(16)
. Es wird kein inkrementeller numerischer Wert generiert.Wenn Sie eine inkrementelle Zifferntaste erstellen möchten, möchten Sie eine Sequenz erstellen.
Sie würden diese Sequenz dann entweder in Ihrer
INSERT
Anweisung verwendenOder Sie können einen Trigger definieren, der den Primärschlüsselwert mithilfe der Sequenz automatisch auffüllt
Wenn Sie Oracle 11.1 oder höher verwenden, können Sie den Trigger etwas vereinfachen
Wenn Sie wirklich verwenden möchten
SYS_GUID
quelle
CACHE 100; in CREATE SEQUENCE name_of_sequence START WITH 1 INCREMENT BY 1 CACHE 100;
dasSYS_GUID()
ist einRAW(16)
, nicht 32.SYS_GUID
Dokumentation erklärt eine,raw(32)
die mich verwirrt hat.Ab Oracle 12c können Sie Folgendes tun:
Und in Oracle (Pre 12c).
quelle
IDENTITY
Beispiel in dieser Antwort viel klarer ist.WHEN (new.MAP_ID IS NULL)
steht nicht in der akzeptierten Antwort. Upvoted.WHEN ( new.MAP_ID is null)
ist in diesem Fall kein guter Code und wird bereits im Kommentarbereich von @ABCade unter akzeptierter Antwort erklärt .. habe gelesen;)CREATE OR REPLACE TRIGGER
bis ausEND;
starte, wird ein Fenster "Bindungen binden" angezeigt. Wenn ich auf "Übernehmen" klicke und in diesem Fenster nichts anderes mache und dann denALTER TRIGGER
Befehl ausführe, ist alles in Ordnung, aber ich wünschte, es gäbe eine Möglichkeit, dieses Popup programmgesteuert zu entfernen und alles zusammen auszuführen. Wenn Sie es insgesamt versuchen, erhalten SiePLS-00103: Encountered the symbol 'ALTER'
und es gefälltEXECUTE IMMEDIATE
auch nicht (der gleiche Fehler, sagt esEncountered the symbol 'EXECUTE'
stattdessen nur).[42000][907] ORA-00907: missing right parenthesis
beim Ausführen der Version für Oracle 12c bekommen. Irgendeine Idee ?Hier sind drei Geschmacksrichtungen:
RAW
Datentyp.x
ist die Identitätsspalte. ErsatzFOO
Sie in jedem der Beispiele Ihren Tabellennamen.aktualisieren:
Oracle 12c führt diese beiden Varianten ein, die nicht von Triggern abhängen:
Der erste verwendet eine Sequenz auf traditionelle Weise; Der zweite verwaltet den Wert intern.
quelle
Angenommen, Sie meinen eine Spalte wie die SQL Server-Identitätsspalte?
In Oracle verwenden Sie eine SEQUENCE, um dieselbe Funktionalität zu erreichen. Ich werde sehen, ob ich einen guten Link finden und hier posten kann.
Update: Sieht so aus, als hätten Sie es selbst gefunden. Hier ist der Link trotzdem: http://www.techonthenet.com/oracle/sequences.php
quelle
In Oracle Database 12c wurde Identity eingeführt, eine automatisch inkrementelle (vom System generierte) Spalte. In den vorherigen Datenbankversionen (bis 11g) implementieren Sie normalerweise eine Identität, indem Sie eine Sequenz und einen Trigger erstellen. Ab 12c können Sie eine eigene Tabelle erstellen und die Spalte definieren, die als Identität generiert werden muss.
Der folgende Artikel erklärt die Verwendung:
Identitätsspalten - Ein neuer Eintrag in Oracle Database 12c
quelle
Trigger
undSequence
kann verwendet werden, wenn Sie eine Seriennummer wünschen, die jeder leicht lesen / merken / verstehen kann. Wenn Sie die ID-Spalte (wie emp_id) jedoch nicht auf diese Weise verwalten möchten und der Wert dieser Spalte nicht sehr hoch ist, können Sie sieSYS_GUID()
bei der Tabellenerstellung verwenden, um eine solche automatische Inkrementierung zu erhalten.Jetzt
emp_id
akzeptiert Ihre Spalte "global eindeutiger Bezeichnerwert". Sie können einen Wert in die Tabelle einfügen, indem Sie die Spalte emp_id wie folgt ignorieren.Es wird also ein eindeutiger Wert in Ihre
emp_id
Spalte eingefügt.quelle
SYS_GUID()
seine ID-Werte auch?Ab Oracle 12c werden Identitätsspalten auf zwei Arten unterstützt:
Sequenz + Tabelle - In dieser Lösung erstellen Sie immer noch eine Sequenz wie gewohnt und verwenden dann die folgende DDL:
TABELLE ERSTELLEN MyTable (ID NUMBER DEFAULT MyTable_Seq.NEXTVAL , ...)
Nur Tabelle - In dieser Lösung wird keine Sequenz explizit angegeben. Sie würden die folgende DDL verwenden:
TABELLE ERSTELLEN MyTable (ID-NUMMER ALS IDENTITÄT ERZEUGT , ...)
Wenn Sie den ersten Weg verwenden, ist er abwärtskompatibel mit der vorhandenen Vorgehensweise. Die zweite ist etwas unkomplizierter und entspricht eher den übrigen RDMS-Systemen.
quelle
es wird aufgerufen
Identity Columns
und ist nur von Oracle Oracle 12c verfügbarBeispiel für das Einfügen in
Identity Columns
wie untenSie können NICHT wie unten einfügen
nützlicher Link
quelle
Hier finden Sie eine vollständige Lösung für die Ausnahme- / Fehlerbehandlung für die automatische Inkrementierung. Diese Lösung ist abwärtskompatibel und funktioniert mit 11g und 12c, insbesondere wenn die Anwendung in Produktion ist.
Bitte ersetzen Sie 'TABLE_NAME' durch Ihren entsprechenden Tabellennamen
quelle
So habe ich das für eine vorhandene Tabelle und Spalte (mit dem Namen id) gemacht:
quelle
quelle
quelle
Orakel hat Sequenzen UND Identitätsspalten in 12c
http://www.oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1.php#identity-columns
Ich fand dies, bin mir aber nicht sicher, was rdb 7 ist http://www.oracle.com/technetwork/products/rdb/0307-identity-columns-128126.pdf
quelle
Nur ich muss nur den Tabellennamen (AUDITLOGS) mit Ihrem Tabellennamen und new.id mit new.column_name ändern
quelle
Vielleicht versuchen Sie einfach dieses einfache Skript:
http://www.hlavaj.sk/ai.php
Ergebnis ist:
quelle
select
in modernen Oracle-Versionen nicht. Sie können einfach:new.pk := TABLE_PK_SEQ.NEXTVAL