sql >> Databáze >  >> RDS >> Oracle

MySQL ekvivalent Oracle SEQUENCE.NEXTVAL

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

3.6.9. Pomocí AUTO_INCREMENT

Atribut AUTO_INCREMENT lze použít ke generování jedinečné identity pro nové řádky:

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 |
+----+---------+

Pro sloupec AUTO_INCREMENT nebyla zadána žádná hodnota, takže MySQL přidělovala pořadová čísla automaticky. Ke sloupci můžete také explicitně přiřadit NULL nebo 0 a vygenerovat pořadová čísla.

Nejnovější hodnotu AUTO_INCREMENT můžete načíst pomocí funkce SQL LAST_INSERT_ID() nebo funkce mysql_insert_id() C API. Tyto funkce jsou specifické pro připojení, takže jejich návratové hodnoty nejsou ovlivněny jiným připojením, které také provádí vkládání.

Pro sloupec AUTO_INCREMENT použijte datový typ nejmenšího celého čísla, který je dostatečně velký, aby pojal maximální hodnotu sekvence, kterou budete potřebovat. Když sloupec dosáhne horního limitu datového typu, další pokus o vygenerování pořadového čísla selže. Pokud je to možné, použijte atribut UNSIGNED, abyste povolili větší rozsah. Pokud například používáte TINYINT, maximální přípustné pořadové číslo je 127. Pro TINYINT UNSIGNED je maximum 255. Viz oddíl 11.2.1 – „Typy celých čísel (přesná hodnota) – INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT ” pro rozsahy všech typů celých čísel.

PoznámkaU víceřádkového vložení vrátí LAST_INSERT_ID() a mysql_insert_id() ve skutečnosti klíč AUTO_INCREMENT z prvního z vložených řádků. To umožňuje správné reprodukování víceřádkových vložení na jiných serverech v nastavení replikace.

Pokud je sloupec AUTO_INCREMENT součástí více indexů, MySQL generuje sekvenční hodnoty pomocí indexu, který začíná sloupcem AUTO_INCREMENT, pokud nějaký existuje. Pokud by například tabulka zvířat obsahovala indexy PRIMARY KEY (grp, id) a INDEX (id), MySQL by ignorovalo PRIMARY KEY pro generování hodnot sekvence. V důsledku toho by tabulka obsahovala jedinou sekvenci, nikoli sekvenci na hodnotu grp.

Chcete-li začít s hodnotou AUTO_INCREMENT jinou než 1, nastavte tuto hodnotu pomocí CREATE TABLE nebo ALTER TABLE takto:

mysql> ALTER TABLE tbl AUTO_INCREMENT =100; Poznámky InnoDB

U tabulek InnoDB buďte opatrní, pokud upravujete sloupec obsahující hodnotu automatického přírůstku uprostřed sekvence příkazů INSERT. Pokud například použijete příkaz UPDATE k vložení nové, větší hodnoty do sloupce automatického přírůstku, při následném INSERT může dojít k chybě „Duplicitní záznam“. Test, zda je již přítomna hodnota automatického přírůstku, nastane, pokud provedete příkaz DELETE následovaný dalšími příkazy INSERT nebo když transakci COMMIT, ale ne po příkazu UPDATE.

Poznámky MyISAM

Pro tabulky MyISAM můžete zadat AUTO_INCREMENT na sekundárním sloupci v indexu s více sloupci. V tomto případě se vygenerovaná hodnota pro sloupec AUTO_INCREMENT vypočítá jako MAX(sloupec_auto_přírůstku) + 1 WHERE prefix=daná-předpona. To je užitečné, když chcete vložit data do uspořádaných skupin.

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 |
+--------+----+---------+

V tomto případě (když je sloupec AUTO_INCREMENT součástí vícesloupcového indexu) se hodnoty AUTO_INCREMENT znovu použijí, pokud odstraníte řádek s nejvyšší hodnotou AUTO_INCREMENT v jakékoli skupině. K tomu dochází i u tabulek MyISAM, pro které se hodnoty AUTO_INCREMENT normálně znovu nepoužívají.

Další čtení

Další informace o AUTO_INCREMENT jsou k dispozici zde:

Jak přiřadit atribut AUTO_INCREMENT ke sloupci:Část 13.1.17, “CREATE TABLE Syntaxe”, a Část 13.1.7, “ALTER TABLE Syntaxe”.

Jak se AUTO_INCREMENT chová v závislosti na režimu SQL NO_AUTO_VALUE_ON_ZERO:Oddíl 5.1.7 – „Režimy SQL serveru“.

Jak použít funkci LAST_INSERT_ID() k nalezení řádku, který obsahuje nejnovější hodnotu AUTO_INCREMENT:Oddíl 12.14 – „Informační funkce“.

Nastavení hodnoty AUTO_INCREMENT, která se má použít:Oddíl 5.1.4 – „Systémové proměnné serveru“.

AUTO_INCREMENT a replikace:Oddíl 16.4.1.1 – „Replikace a AUTO_INCREMENT“.

Serverové systémové proměnné související s AUTO_INCREMENT (auto_increment_increment a auto_increment_offset), které lze použít pro replikaci:Oddíl 5.1.4 – „Systémové proměnné serveru“.

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



  1. Přepište Query Optimizer pro vaše spojení T-SQL pomocí FORCEPLAN

  2. Jak provést uloženou proceduru v programu C#

  3. SQL Query pomalý v aplikaci .NET, ale okamžitý v SQL Server Management Studio

  4. Způsoby nastavení parametrů NLS a jejich priorit (databáze Oracle)