2009-10-30 4 views

Antwort

32

Der Primärschlüssel eine Spalte in einer Tabelle ist.

Der Primärschlüssel braucht einen einzigartigen Wert, der irgendwo herkommen muss.

Die Sequenz ist eine Funktion einiger Datenbankprodukte, die nur eindeutige Werte erzeugt. Es erhöht nur einen Wert und gibt ihn zurück. Das Besondere daran ist: Es gibt keine Transaktionsisolation, daher können mehrere Transaktionen nicht den gleichen Wert erhalten, die Inkrementierung wird auch nicht zurückgesetzt. Ohne eine Datenbanksequenz ist es sehr schwierig, eindeutige inkrementelle Zahlen zu erzeugen.

Andere Datenbankprodukte unterstützen Spalten, die automatisch mit einer fortlaufenden Nummer initialisiert werden.

Es gibt andere Möglichkeiten zum Erstellen eindeutiger Werte für die Primärschlüssel, z. B. Guids.

+0

Wenn es keine Transaktionsisolation gibt, wie könnte es dann verwendet werden? – rapt

+4

Es gibt keine Transaktionsisolation für die Generierung der IDs. Es gibt immer den nächsten Wert der Sequenz zurück. Transaktionsisolation würde bedeuten, dass die parallele Transaktion entweder den gleichen Wert erhält oder auf die andere Transaktion warten muss, bevor sie den nächsten Wert erhalten kann. Dies ist weder erforderlich noch nützlich. –

3

Sequence ermöglicht es Ihnen, Primärschlüssel mit einer eindeutigen, serialisierten Nummer zu füllen.

Es unterscheidet sich von einem serial oder auto_incremement Primärschlüssel in dem Sinne, dass:

  • Es ist eine tatsächliche Datenbankobjekt (müssen Sie es erstellen):

    sql> create sequence NAME_OF_YOUR_SEQUENCE;

  • Sie könnte für unterschiedliche Datenbankbenutzer unabhängige Berechtigungen zuweisen:

    sql> grant select on NAME_OF_YOUR_SEQUENCE to NAME_OF_YOUR_USER;

  • Sie können eine eindeutige Nummer verwenden, die bei mehreren Tabellen (nicht nur einer) unterschiedlich ist. Angenommen, Sie haben vier Tabellen mit numerischen Primärschlüsseln, und Sie möchten eindeutige Zahlen unter diesen vier Tabellen. Sie können dafür eine Sequenz verwenden, ohne sich Gedanken darüber machen zu müssen, ob Sie die Sperrmechanismen manuell implementieren können.

  • Sie können ihre Zahl auf einen beliebigen Wert Sie mit alter sequence

    wollen ändern
  • können Sie durch seine Zahlen

    sql> create sequence NAME_OF_YOUR_SEQUENCE maxvalue 1500 cycle;

+0

Also, wie unterscheidet sich eine Sequenz von einem Primärschlüssel auto_increment? Oder ist das eigentlich eine Sequenz? – Blaise

+1

Überprüfen Sie meine aktualisierte Antwort @Blaise –

5

Der Primärschlüssel ist (in technischer Hinsicht) lediglich ein Index, der die Eindeutigkeit erzwingt (und auch die Abfrageleistung beschleunigt). Da gibt es einige semantische Informationen, die der "Schlüssel" für die Entity sind, die die Zeile beschreibt, aber das ist es.

Eine Sequenz ist eine völlig andere Entität; es existiert getrennt von Tabellen (wie eine gespeicherte Prozedur) und kann aufgerufen werden, um sequentielle Zahlen zu erhalten.

Die beiden werden oft zusammen verwendet, um automatische Primärschlüssel für Entitäten zu generieren, die keine sinnvollen "nativen" Schlüssel haben. Aber sie sind zwei getrennte Konzepte; Sie können Tabellen verwenden, in denen der Primärschlüssel während eines Einfügevorgangs explizit ausgefüllt wird, und Sie können Sequenzen verwenden, die zum Füllen von Nicht-PK-Spalten verwendet werden (oder sogar während einer gespeicherten Prozedur verwendet werden und nicht zum Einfügen von Datensätzen verwendet werden).

Verwandte Themen