Oracle
 sql >> Baza danych >  >> RDS >> Oracle

MySQL odpowiednik Oracle SEQUENCE.NEXTVAL

http://docs.oracle.com/cd/E17952_01/refman-5.5-en/example-auto-increment.html

3.6.9. Korzystanie z AUTO_INCREMENT

Atrybut AUTO_INCREMENT może być użyty do wygenerowania unikalnej tożsamości dla nowych wierszy:

CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
);

INSERT INTO animals (name) VALUES
    ('dog'),('cat'),('penguin'),
    ('lax'),('whale'),('ostrich');

SELECT * FROM animals;
Which returns:

+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+

Nie określono wartości dla kolumny AUTO_INCREMENT, więc MySQL automatycznie przypisał numery sekwencyjne. Możesz również jawnie przypisać NULL lub 0 do kolumny, aby wygenerować numery sekwencyjne.

Najnowszą wartość AUTO_INCREMENT można pobrać za pomocą funkcji SQL LAST_INSERT_ID() lub funkcji API języka C mysql_insert_id(). Funkcje te są specyficzne dla połączenia, więc na ich wartości zwracane nie ma wpływu inne połączenie, które również wykonuje wstawianie.

Użyj najmniejszego typu danych liczb całkowitych dla kolumny AUTO_INCREMENT, która jest wystarczająco duża, aby pomieścić maksymalną potrzebną wartość sekwencji. Gdy kolumna osiągnie górny limit typu danych, następna próba wygenerowania numeru sekwencyjnego nie powiedzie się. Jeśli to możliwe, użyj atrybutu UNSIGNED, aby zezwolić na większy zakres. Na przykład, jeśli używasz TINYINT, maksymalnym dozwolonym numerem sekwencji jest 127. Dla TINYINT UNSIGNED maksymalnym jest 255. Zobacz Sekcja 11.2.1, „Typy liczb całkowitych (dokładna wartość) — INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT ” dla zakresów wszystkich typów liczb całkowitych.

Uwaga:W przypadku wstawiania wielu wierszy LAST_INSERT_ID() i mysql_insert_id() faktycznie zwracają klucz AUTO_INCREMENT z pierwszego z wstawionych wierszy. Umożliwia to prawidłowe odtworzenie wielowierszowych wstawek na innych serwerach w konfiguracji replikacji.

Jeśli kolumna AUTO_INCREMENT jest częścią wielu indeksów, MySQL generuje wartości sekwencji przy użyciu indeksu rozpoczynającego się od kolumny AUTO_INCREMENT, jeśli taka istnieje. Na przykład, jeśli tabela zwierzęta zawiera indeksy PRIMARY KEY (grp, id) i INDEX (id), MySQL zignoruje PRIMARY KEY do generowania wartości sekwencji. W rezultacie tabela zawierałaby pojedynczą sekwencję, a nie sekwencję na wartość grupy.

Aby rozpocząć od wartości AUTO_INCREMENT innej niż 1, ustaw tę wartość za pomocą CREATE TABLE lub ALTER TABLE, w ten sposób:

mysql> ALTER TABLE tbl AUTO_INCREMENT =100;InnoDB Uwagi

W przypadku tabel InnoDB należy zachować ostrożność podczas modyfikowania kolumny zawierającej wartość automatycznego zwiększania w środku sekwencji instrukcji INSERT. Na przykład, jeśli użyjesz instrukcji UPDATE, aby umieścić nową, większą wartość w kolumnie auto-inkrementacji, kolejne INSERT może napotkać błąd „Duplikat wpisu”. Test, czy wartość automatycznego zwiększania jest już obecna, ma miejsce, jeśli wykonasz polecenie DELETE, po którym następuje więcej instrukcji INSERT, lub gdy transakcja zostanie COMMIT, ale nie po instrukcji UPDATE.

Notatki MyISAM

W przypadku tabel MyISAM można określić AUTO_INCREMENT w dodatkowej kolumnie w indeksie wielokolumnowym. W takim przypadku wygenerowana wartość dla kolumny AUTO_INCREMENT jest obliczana jako MAX(auto_increment_column) + 1 WHERE prefix=podany-prefiks. Jest to przydatne, gdy chcesz umieścić dane w uporządkowanych grupach.

CREATE TABLE animals (
    grp ENUM('fish','mammal','bird') NOT NULL,
    id MEDIUMINT NOT NULL AUTO_INCREMENT,
    name CHAR(30) NOT NULL,
    PRIMARY KEY (grp,id)
) ENGINE=MyISAM;

INSERT INTO animals (grp,name) VALUES
    ('mammal','dog'),('mammal','cat'),
    ('bird','penguin'),('fish','lax'),('mammal','whale'),
    ('bird','ostrich');

SELECT * FROM animals ORDER BY grp,id;
Which returns:

+--------+----+---------+
| grp    | id | name    |
+--------+----+---------+
| fish   |  1 | lax     |
| mammal |  1 | dog     |
| mammal |  2 | cat     |
| mammal |  3 | whale   |
| bird   |  1 | penguin |
| bird   |  2 | ostrich |
+--------+----+---------+

W takim przypadku (gdy kolumna AUTO_INCREMENT jest częścią indeksu wielokolumnowego), wartości AUTO_INCREMENT są ponownie używane, jeśli usuniesz wiersz z największą wartością AUTO_INCREMENT w dowolnej grupie. Dzieje się tak nawet w przypadku tabel MyISAM, dla których wartości AUTO_INCREMENT zwykle nie są ponownie używane.

Dalsza lektura

Więcej informacji o AUTO_INCREMENT można znaleźć tutaj:

Jak przypisać atrybut AUTO_INCREMENT do kolumny:Sekcja 13.1.17, „Składnia CREATE TABLE” i Sekcja 13.1.7, „Składnia ALTER TABLE”.

Jak zachowuje się AUTO_INCREMENT w zależności od trybu NO_AUTO_VALUE_ON_ZERO SQL:Sekcja 5.1.7, „Tryby SQL serwera”.

Jak użyć funkcji LAST_INSERT_ID(), aby znaleźć wiersz zawierający najnowszą wartość AUTO_INCREMENT:Sekcja 12.14, „Funkcje informacyjne”.

Ustawianie wartości AUTO_INCREMENT, która ma być używana:Sekcja 5.1.4, „Zmienne systemowe serwera”.

AUTO_INCREMENT i replikacja:Sekcja 16.4.1.1, „Replikacja i AUTO_INCREMENT”.

Zmienne systemu serwera powiązane z AUTO_INCREMENT (auto_increment_increment i auto_increment_offset), których można użyć do replikacji:Sekcja 5.1.4, „Zmienne systemowe serwera”.

http://search.oracle.com/search/search?q=auto_increment&group=Dokumentacja&x=0&y=0



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Szybsza alternatywa w Oracle do SELECT COUNT(*) FROM sometable

  2. Oracle.DataAccess nie jest dostępny do wyboru w Visual Studio 2013

  3. Przekazywanie tablicy danych jako parametru wejściowego do procedury Oracle

  4. Opcja dostawy podczas składania równoległego żądania w R12.1.3

  5. Odpowiednik zewnętrznych tabel Oracle w SQL Server