Wie erstelle ich eine Sequenz in MySQL?

I'm versucht, eine Sequenz in MySQL zu erstellen (I'm sehr neu zu SQL als Ganzes). I'm mit dem folgenden Code, aber es verursacht einen Fehler:

CREATE SEQUENCE ORDID INCREMENT BY 1 START WITH 622;

ORDID verweist auf ein Feld in einer Tabelle, die ich verwende. Wie kann ich die Sequenz richtig erstellen?

Bearbeiten:

Angeblich verwendet MySQL keine Sequenzen. Ich verwende jetzt den folgenden Code, aber auch dieser verursacht Fehler. Wie kann ich sie beheben?

CREATE TABLE ORD (
ORDID NUMERIC(4) NOT NULL AUTO_INCREMENT START WITH 622,
//Rest of table code

Bearbeiten:

Ich glaube, ich habe eine Lösung gefunden. Für phpMyAdmin (das ich benutzte) können Sie den folgenden Code verwenden.

ALTER TABLE ORD AUTO_INCREMENT = 622;

Ich habe keine Ahnung, warum es diesen Code bevorzugt, aber falls noch jemand Hilfe braucht, hier ist sie:)

Dies ist eine Lösung die im MySQl-Handbuch vorgeschlagen wird:

Wenn expr als Argument für LAST_INSERT_ID() angegeben wird, wird der Wert des Argumentes von der Funktion zurückgegeben und wird als der nächste Wert, der von LAST_INSERT_ID() zurückgegeben wird. Dies kann verwendet werden, um Sequenzen:

Erstellen Sie eine Tabelle für den Sequenzzähler und initialisieren Sie sie:

mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0);

Verwenden Sie die Tabelle, um Sequenznummern wie folgt zu erzeugen:

mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1); mysql> SELECT LAST_INSERT_ID();

Die UPDATE-Anweisung erhöht den Sequenzzähler und veranlasst den nächsten Aufruf von LAST_INSERT_ID(), den aktualisierten Wert zurückzugeben. Die SELECT-Anweisung ruft diesen Wert ab. Die mysql_insert_id() C API Funktion kann ebenfalls benutzt werden, um den Wert zu erhalten. Siehe Abschnitt 23.8.7.37, "mysql_insert_id()".

Sie können Sequenzen erzeugen, ohne LAST_INSERT_ID() aufzurufen, aber der Nutzen der Verwendung der Funktion auf diese Weise ist, dass der ID-Wert im Server als der letzte automatisch erzeugte Wert erhalten bleibt. Die Funktion ist Multi-User sicher, da mehrere Clients die UPDATE Anweisung ausführen und ihren eigenen Sequenzwert mit der SELECT-Anweisung abrufen können (oder mysql_insert_id()) abrufen können, ohne andere Clients, die ihre eigenen Werte erzeugen, zu beeinflussen oder von ihnen beeinflusst zu werden. Clients beeinflusst werden, die ihre eigenen Sequenzwerte erzeugen.

Kommentare (0)
Lösung

Sehen Sie sich diesen Artikel an. Ich glaube, er sollte Ihnen helfen, das zu bekommen, was Sie wollen. Wenn Ihre Tabelle bereits existiert und bereits Daten enthält, kann der Fehler, den Sie erhalten, darauf zurückzuführen sein, dass auto_increment versucht, einen Wert zuzuweisen, der bereits für andere Datensätze existiert.

Kurz gesagt, wie andere bereits in Kommentaren erwähnt haben, gibt es Sequenzen, wie sie in Oracle gedacht und gehandhabt werden, in MySQL nicht. Sie können jedoch wahrscheinlich auto_increment verwenden, um zu erreichen, was Sie wollen.

Ohne weitere Details zu dem spezifischen Fehler ist es schwierig, genauere Hilfe zu leisten.

UPDATE

CREATE TABLE ORD (
  ORDID INT NOT NULL AUTO_INCREMENT,
  //Rest of table code
  PRIMARY KEY (ordid)
)
AUTO_INCREMENT = 622;

Dieser Link ist ebenfalls hilfreich für die Beschreibung der Verwendung von auto_increment. Das Setzen des AUTO_INCREMENT-Wertes scheint eine Tabellenoption zu sein, und nicht etwas, das speziell als Spaltenattribut angegeben wird.

Laut einem der obigen Links können Sie alternativ den Startwert von auto increment über eine Änderung Ihrer Tabelle festlegen.

ALTER TABLE ORD AUTO_INCREMENT = 622;

UPDATE 2 Hier ist ein Link zu einem funktionierenden sqlfiddle-Beispiel, das auto increment verwendet.
Ich hoffe, diese Informationen helfen.

Kommentare (5)

Bei der Erstellung der Inkrement-Tabelle sollten Sie darauf achten, eingefügte Zeilen nicht zu löschen. Der Grund dafür ist, die Speicherung großer dummer Daten in der Datenbank mit IDs darin zu vermeiden. Andernfalls würde bei einem Neustart von mysql die maximal existierende Zeile abgerufen und die Inkrementierung von diesem Punkt aus fortgesetzt, wie in der Dokumentation erwähnt http://dev.mysql.com/doc/refman/5.0/en/innodb-auto-increment-handling.html

Kommentare (0)