2009-07-30 13 views
15

Kann jemand aufklären, warum dieses Orakel keine Autoinkrementfunktion für Primärschlüssel unterstützt?Warum Orakel hat keine Autoinkrement-Funktion für Primärschlüssel?

Ich weiß, dass die gleiche Funktion mit Hilfe von Sequenz und Triggern erreicht werden kann, aber warum Oracle das Autoincrement-Schlüsselwort nicht eingeführt hat, das intern eine Sequenz und einen Trigger erstellen wird. Ich wette, Jungs in Orakel hätten bestimmt darüber nachgedacht. Es muss einen Grund geben, dieses Feature nicht anzugeben. Irgendwelche Gedanken?

Antwort

15

Es kann nur Terminologie sein. 'AUTOINCREMENT' bedeutet, dass der Datensatz '103' zwischen den Datensätzen '102' und '104' erstellt wird. In Cluster-Umgebungen ist dies für Sequenzen nicht unbedingt der Fall. Ein Knoten kann "100", "101", "102" einfügen, während der andere Knoten "110", "111", "112" einfügt, so dass die Datensätze "außer Betrieb" sind. [Natürlich hat der Begriff "Sequenz" die gleiche Bedeutung.)

Wenn Sie sich entschließen, dem Sequenzmodell nicht zu folgen, dann führen Sie Sperr- und Serialisierungsprobleme ein. Erzwingen Sie, dass eine Einfügung auf das Commit/Rollback einer anderen Einfügung wartet, bevor Sie den nächsten Wert bestimmen, oder akzeptieren Sie, dass bei einem Rollback einer Transaktion Lücken in den Schlüsseln auftreten.

Dann gibt es das Problem, was Sie tun, wenn jemand eine Zeile mit einem bestimmten Wert für dieses Feld in die Tabelle einfügen will (dh ist es erlaubt, oder funktioniert es wie ein DEFAULT) oder wenn jemand versucht, es zu aktualisieren . Wenn jemand "101" einfügt, springt der Autoinkrement zu "102" oder riskieren Sie doppelte Werte.

Es kann Auswirkungen auf ihre IMP-Dienstprogramme und direkten Pfad schreiben und Abwärtskompatibilität haben.

Ich sage nicht, dass es nicht getan werden konnte. Aber ich vermute, am Ende hat jemand es angeschaut und entschieden, dass sie die Entwicklungszeit woanders besser verbringen können.


bearbeiten hinzuzufügen:

In Oracle 12.1, Unterstützung für eine Identity-Spalte hinzugefügt wurde.

"Der Identitätsspalte wird für jede nachfolgende INSERT-Anweisung ein ansteigender oder abnehmender ganzzahliger Wert aus einem Sequenzgenerator zugewiesen. Sie können die identity_options-Klausel verwenden, um den Sequenzgenerator zu konfigurieren."

https://docs.oracle.com/database/121/SQLRF/statements_7002.htm#CJAHJHJC

5

Weil es sequences hat, was alles Autoincrement tun kann, und dann einige.

+0

defekte Verbindung in 17-06-2014 – guisantogui

+1

Aktualisiert - danke für die Kenntnisnahme. –

1

Viele haben sich darüber beschwert, aber die Antwort ist im Allgemeinen, dass Sie leicht genug mit einer Sequenz und einem Trigger erstellen können.

5

Dies ist seit einiger Zeit ein Streitpunkt zwischen den verschiedenen DB-Lagern. Für ein Datenbanksystem, das so ausgefeilt und gut aufgebaut ist wie Oracle, betäubt es mich immer noch, dass es so viel Code und Aufwand erfordert, um diese häufig verwendete und wertvolle Funktion zu ermöglichen.

Ich empfehle nur eine Art von inkrementellen-Primär-Schlüssel Builder/Funktion/Werkzeug in Ihrem Toolkit und haben es praktisch für Oracle Arbeit. Und schreiben Sie Ihrem Kongressabgeordneten und sagen Sie ihm, wie schlimm es ist, diese Funktion über die GUI oder eine einzelne SQL-Zeile verfügbar zu machen!

+0

Eigentlich hat Oracle das Konzept einer SEQUENCE, wonach Sie suchen. –

+4

Zusätzlich zum Autoinkrement müssen Sie jedoch den Primärschlüsselaspekt hinzufügen. Mit MS-SQL können Sie beides mit einer Anweisung (oder ein paar Mausklicks) machen. Mein Punkt ist, dass es in MS-SQL einfacher ist. – ajh1138

-1

Sequenzen können nicht mehr synchronisiert sind leicht (jemand fügt einen Datensatz manuell in der Datenbank, ohne die Reihenfolge der Aktualisierung).Oracle hätte das schon vor Ewigkeiten umsetzen sollen! Sequenzen sind einfach zu verwenden, aber nicht so einfach wie Autoincrement (sie erfordern ein zusätzliches Coding).

Verwandte Themen