V tomto článku prozkoumáme základy a podrobnosti o vlastnosti SQL Server IDENTITY a funkcích sloupce IDENTITY. Také zvážíme, jak vložit explicitní hodnoty do sloupců identity pomocí funkce IDENTITY_INSERT.
Úvod do vlastnosti SQL Server IDENTITY a sloupce IDENTITY
V SQL Server nám vlastnost identity umožňuje vytvářet sloupce identity v tabulkách SQL Serveru podle nastavení syntaxe vlastnosti identity. Syntaxe vlastnosti identity vypadá následovně a tuto syntaxi použijeme k vytvoření nebo změně příkazu tabulky.
IDENTITA [(počátek, přírůstek)]
Nejprve prozkoumáme parametry vlastnosti identity. Tato vlastnost má dva vstupní parametry:první je počáteční a druhý je přírůstek. Parametr seed určuje, že první počáteční hodnota vkládané hodnoty do tabulky a parametr Increment definuje hodnotu přírůstku vložených dat.
Nyní tuto základní definici identity identity zintenzivníme na několika příkladech.
Jak vytvořit sloupec identity na serveru SQL Server
Příklad-1 :V následujícím příkladu vytvoříme sloupec identity a první hodnota bude začínat od 1 a bude se zvyšovat o 1 po 1.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('První vložený řádek')INSERT INTO TestIdentityVALUES ('Druhý vložený řádek')INSERT TestIdentityVALUES ('Třetí vložený řádek')INSERT INTO TestIdentityVALUES ('Čtvrtý vložený řádek')VYBRAT ID jako [IdentityColumn],Sloupec1 FROM TestIdentity
Příklad-2 :V následujícím příkladu vytvoříme sloupec identity a první hodnota bude začínat od 37 a bude se zvyšovat o 20 o 20.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(37,20) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('První vložený řádek')INSERT INTO TestIdentityVALUES ('Druhý vložený řádek'INSERT') TestIdentityVALUES ('Třetí vložený řádek')INSERT INTO TestIdentityVALUES ('Čtvrtý vložený řádek')VYBRAT ID jako [IdentityColumn],Sloupec1 FROM TestIdentity
Jak můžete vidět ve výše uvedeném příkladu, vlastnost identity poskytuje generování hodnot automatického přírůstku podle seed a parametrů identity.
Jak vložit explicitní hodnoty do sloupce identity serveru SQL?
Ve výchozím nastavení nám vlastnost identity neumožňuje vkládat explicitní hodnoty do sloupců identity. Pokud se pokusíte vložit explicitní hodnoty do sloupce identity, dojde k následující chybě.
PUSTIT TABULKU, POKUD EXISTUJE TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES (1,'První vložený řádek')
Zpráva 8101, úroveň 16, stav 1, řádek 9
Explicitní hodnota pro sloupec identity v table, ‘TestIdentity’ lze zadat pouze v případě, že je použit seznam sloupců a IDENTITY_INSERT je zapnuto.
Tuto chybu můžeme překonat povolením funkce IDENTITY_INSERT tabulky. Nyní změníme příkaz insert následovně.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Sloupec1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) VALUES (1)'První vložený řádek' TestIdentity OFFSELECT * Z TestIdentity
Dalším klíčovým bodem tohoto problému je, že musíme napsat seznam sloupců do příkazu insert. Pokud to neuděláme, dojde k následující chybě.
PUSTÍ TABULU, POKUD EXISTUJE TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Sloupec1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity VALUES (1,'První vložený řádek')SET IDENTIITY_INSERT Test>
Zpráva 8101, úroveň 16, stav 1, řádek 9
Explicitní hodnota pro sloupec identity v table, ‘TestIdentity’ lze zadat pouze v případě, že je použit seznam sloupců a IDENTITY_INSERT je zapnuto.Tato chyba definuje, že v příkazu insert chybí seznam sloupců. V níže uvedeném příkazu insert tuto chybu opravíme.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Sloupec1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) ---sloupec seznam'první vložený řádek (90, ')SET IDENTITY_INSERT TestIdentity OFF
V některých případech potřebujeme vložit data do jedné tabulky z jiné tabulky. Jedním z nejlepších způsobů, jak provést tuto operaci, je použít příkazy „INSERT INTO SELECT“. Pokud však cílová tabulka obsahuje sloupec identity, musíme v cílové tabulce povolit volbu IDENTITY_INSERT. Také musíme napsat seznam sloupců cílové tabulky.
DROP TABLE IF EXISTS TestIdentityDROP TABLE IF EXISTS SourceTable CREATE TABLE SourceTable (ID INT,Val1 VARCHAR(100))INSERT INTO SourceTable VALUES (1,'První řádek'),(2,'Druhý řádek')GOCREATE (TABLE TestIdent) Id INT IDENTITY(1,1) ,Sloupec1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Sloupec1) SELECT * FROM SourceTableSET IDENTITY_INSERT TestIdentity OFF
Nevýhodou možnosti IDENTITY_INSERT je, že může způsobit mezeru mezi hodnotami sloupce identity. Příkaz podobný následujícímu vygeneruje mezeru mezi hodnotami sloupce identity.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Sloupec1 VARCHAR(100))INSERT INTO TestIdentity ---column listVALUES ('První vložený řádek (INDENTITY_INSERT_OFF)')SET IDENTITY INdentINTO TestIdentity (Id,Col1) ---column listVALUES (90,'Druhý vložený řádek (INDENTITY_INSERT_ON')SET IDENTITY_INSERT TestIdentity OFFINSERT INTO TestIdentity ---column listVALUES ('Třetí vložený řádek (INDENTITY_INSERT_OFF)')SELECT * FROM TestIdentity /před>
Příkaz DBCC CHECKIDENT
Příkaz DBCC CHECKIDENT nám umožňuje získat podrobnosti o poslední hodnotě sloupce identity. Tato funkce také umožňuje resetování a změnu aktuální hodnoty sloupce identity na jinou hodnotu. Nyní získáme poslední hodnotu identity pomocí příkazu DBCC CHECKIDENT.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('První vložený řádek')INSERT INTO TestIdentityVALUES ('Druhý vložený řádek')INSERT TestIdentityVALUES ('Třetí vložený řádek')INSERT INTO TestIdentityVALUES ('Čtvrtý vložený řádek')DBCC CHECKIDENT ('TestIdentity', NORESEED)
Další možností o příkazu DBCC CHECKIDENT je obnovení sloupce identity na požadovanou hodnotu. V následujícím příkladu parametr RESEED změní maximální hodnotu sloupce identity na 100 a následně vložené hodnoty použijí tuto maximální hodnotu.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('První vložený řádek')INSERT INTO TestIdentityVALUES ('Druhý vložený řádek')INSERT TestIdentityVALUES ('Třetí vložený řádek')INSERT INTO TestIdentityVALUES ('Čtvrtý vložený řádek')GODBCC CHECKIDENT ('TestIdentity',RESEED,100)GOINSERT INTO TestIdentityVALUES ('Pátý vložený řádek')SELECT * FROM TestIdentity
Sloupec identity a jedinečnost serveru SQL Server
Sloupce identity nezaručují generování jedinečných hodnot. Toto je běžný matoucí problém u sloupců identity, takže pokud chceme zajistit jedinečnost generovaných hodnot, můžeme pro tyto sloupce použít jedinečný index. Nyní si ukážeme a předvedeme, jak vytvořit duplicitní hodnoty ve sloupcích identity.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Sloupec1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1)OFFVALUES (1,'První vložený řádek_INSERT )INSERT INTO TestIdentity (Id,Col1)VALUES (1,'První vložený řádek (INDENTITY_INSERT_OFF)')SET IDENTITY_INSERT TestIdentity OFFSELECT * FROM TestIdentity
Kromě toho jsou sloupce identity a primární klíče dva odlišné objekty na serveru SQL Server. Účelem použití sloupce identity je generovat automaticky navýšené číslo. Na druhou stranu omezení primárního klíče zaručuje a poskytuje jedinečnost hodnot v konkrétním sloupci. Omezení primárního klíče vynucuje jedinečné hodnoty pro definované sloupce, protože ve výchozím nastavení vytváří primární klíč v tabulce seskupený jedinečný index. Při běžném použití lze omezení primárního klíče a vlastnost identity používat společně. Tento přístup použití nám pomáhá přinést flexibilitu jedinečnosti primárního klíče a funkce automatického přírůstku identity do použitého sloupce. V následujícím příkladu také přidáme omezení primárního klíče do sloupce Id a zabráníme duplikování vložených hodnot.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) PRIMÁRNÍ KLÍČ,Sloupec1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Sloupec1)Vloženo HODNOTY (1,'The první vložený řádek )')INSERT INTO TestIdentity (Id,Col1)VALUES (1,'První vložený řádek (INDENTITY_INSERT_OFF)')SET IDENTITY_INSERT TestIdentity OFFSELECT * FROM TestIdentity
Když v průzkumníku objektů přejdeme na kartu Indexy v tabulce TestIdentity, můžeme najít jedinečný seskupený index, který byl vytvořen omezením primárního klíče. Toto omezení vynucuje jedinečné hodnoty pro sloupec ID.
Závěr
V tomto článku jsme diskutovali o základních konceptech a metodách použití vlastností SQL Server Identity a sloupců identity.
Odkazy
- VYTVOŘTE IDENTITU (Vlastnost) TABULKY (Transact-SQL)
- Vytvořte primární klíče