Když používáte T-SQL k vytvoření (nebo změně) tabulky na SQL Server, máte možnost použít IDENTITY()
vlastnost k vytvoření sloupce identity.
Sloupec identity obsahuje automaticky se zvyšující identifikační číslo. IDENTITY()
vlastnost lze použít s CREATE TABLE
a ALTER TABLE
prohlášení.
Syntaxe
Syntaxe vypadá takto:
IDENTITY [ (seed , increment) ]
semeno je hodnota, která se používá pro úplně první řádek načtený do tabulky.
přírůstek je přírůstková hodnota, která se přičte k hodnotě identity předchozího načteného řádku.
Musíte zadat oba argumenty nebo žádný. Pokud nezadáte ani jedno, výchozí hodnota je (1,1)
.
Příklad 1 – Základní použití
Zde je příklad k demonstraci.
CREATE TABLE Pets ( PetId int IDENTITY(1,1) PRIMARY KEY, PetName varchar(255) );
Tento kód vytvoří tabulku se dvěma sloupci. První sloupec (PetId
) je sloupec identity, protože používám IDENTITY()
vlastnost v její definici.
Nyní, když jsem vytvořil sloupec identity, mohu do PetName
vkládat jména domácích mazlíčků sloupec bez nutnosti uvádět ID pro každý řádek.
INSERT INTO Pets (PetName) VALUES ('Homer'), ('Felix'), ('Ruff'); SELECT * FROM Pet;
Výsledek:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 1 | Homer | | 2 | Felix | | 3 | Ruff | +---------+-----------+
Příklad 2 – Různé počáteční a přírůstky
Zde je příklad, který používá jiné semeno a přírůstek.
V tomto případě semena začíná na 150 a zvyšuje se o 10 pro každý řádek.
CREATE TABLE Cities ( CityId int IDENTITY(150, 10) PRIMARY KEY, CityName varchar(255) );
Nyní vložte nějaká data a vyberte je:
INSERT INTO Cities (CityName) VALUES ('Auckland'), ('Danang'), ('Khon Kaen'); SELECT * FROM Cities;
Výsledek:
+----------+------------+ | CityId | CityName | |----------+------------| | 150 | Auckland | | 160 | Danang | | 170 | Khon Kaen | +----------+------------+
Příklad 3 – Nesprávné použití
Jak již bylo zmíněno, musíte zadat oba argumenty nebo žádný. Jinými slovy, nemůžete poskytnout pouze jeden argument. Zde je příklad toho, co se stane, když poskytnete pouze jeden argument.
CREATE TABLE Cities ( CityId int IDENTITY(1) PRIMARY KEY, CityName varchar(255) );
Výsledek:
Msg 102, Level 15, State 1, Line 2 Incorrect syntax near ')'.
Příklad 4 – Pokus o přepsání hodnot identity
Pokud se pokusíte přepsat hodnoty automatické identity, může se zobrazit tato chyba.
INSERT INTO Cities (CityId, CityName) VALUES (123, 'Bangkok');
Výsledek:
Msg 544, Level 16, State 1, Line 1 Cannot insert explicit value for identity column in table 'Cities' when IDENTITY_INSERT is set to OFF.
Je to proto, že se pokoušíte přepsat hodnoty vytvořené pomocí IDENTITY()
vlastnictví. V mnoha případech se může stát, že jste prostě nevěděli, že jde o sloupec identity. V takových případech vše, co musíte udělat, je odstranit sloupec identity z vašeho INSERT
prohlášení.
Pokud však skutečně děláte potřeba přepsat IDENTITY()
vlastnost, viz Jak vložit hodnoty do sloupce IDENTITY na serveru SQL.
Jak již bylo zmíněno, pokud nepotřebujete přepsat hodnoty identity, můžete tento sloupec jednoduše odstranit z INSERT
prohlášení.
Takže mohu upravit předchozí prohlášení na toto:
INSERT INTO Cities (CityName) VALUES ('Bangkok'); SELECT * FROM Cities;
Výsledek:
+----------+------------+ | CityId | CityName | |----------+------------| | 150 | Auckland | | 160 | Danang | | 170 | Khon Kaen | | 180 | Bangkok | +----------+------------+
Omezení vlastnosti IDENTITY()
Vlastnost identity na sloupci zaručuje následující:
- Každá nová hodnota je generována na základě aktuálního zdroje a přírůstku.
- Každá nová hodnota pro konkrétní transakci se liší od ostatních souběžných transakcí v tabulce.
Nezaručuje následující:
- Jedinečnost hodnoty
- Po sobě jdoucí hodnoty v rámci transakce
- Po sobě jdoucí hodnoty po restartu serveru nebo jiných selháních
- Opětovné použití hodnot (například když
INSERT
operace se nezdaří)
Další informace o těchto omezeních naleznete v dokumentaci společnosti Microsoft.