В тази статия ще разгледаме основите и подробностите за свойството IDENTITY на SQL Server и функциите на колоната IDENTITY. Също така ще разгледаме как да вмъкнем изрични стойности в колоните за идентичност чрез функцията IDENTITY_INSERT.
Въведение в свойството IDENTITY на SQL Server и колоната IDENTITY
В SQL Server свойството identity ни позволява да създаваме колони за идентичност в таблиците на SQL Server според настройките на синтаксиса на свойството на идентичност. Синтаксисът на свойството identity изглежда по следния начин и ние прилагаме този синтаксис, за да създадем или променим израз на таблица.
ИДЕНТИФИКАЦИЯ [(семена, инкремент)]
Първо ще разгледаме параметрите на свойството identity. Това свойство приема два входни параметъра:първият е начален, а вторият е инкремент. Параметърът seed указва, че първата начална стойност на вмъкнатата стойност в таблицата, а параметърът Increment определя стойността на увеличение на вмъкнатите данни.
Сега ще засилим тази основна дефиниция на свойството на идентичност с някои примери.
Как да създадете колона за идентичност в SQL Server
Пример-1 :В следващия пример ще създадем колона за идентичност и първата стойност ще започне от 1 и ще увеличи 1 с 1.
ПУСНЕТЕ ТАБЛИЦА, АКО СЪЩЕСТВУВА TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('Първият вмъкнат ред')INSERT INTO TestIdentityVALUES ('Вторият вмъкнат ред В TestIdentityVALUES („Третият вмъкнат ред“)INSERT INTO TestIdentityVALUES („Четвъртият вмъкнат ред“)ИЗБЕРЕТЕ ИД като [IdentityColumn],Col1 ОТ TestIdentity
Пример-2 :В следващия пример ще създадем колона за идентичност и първата стойност ще започне от 37 и ще увеличи 20 на 20.
ПУСНЕТЕ ТАБЛИЦА, АКО СЪЩЕСТВУВА TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(37,20) ,Col1 VARCHAR(100))ВЪВЕТЕ В TestIdentityVALUES ('Първият вмъкнат ред')INSERT INTO TestIdentityVALUES ('Вторият вмъкнат ВМЕСТЕ ВЪВ TestIdentityVALUES („Третият вмъкнат ред“)INSERT INTO TestIdentityVALUES („Четвъртият вмъкнат ред“)ИЗБЕРЕТЕ ИД като [IdentityColumn],Col1 ОТ TestIdentity
Както можете да видите в горния пример, свойството identity осигурява генериране на стойностите за автоматично увеличение според началните и идентификационните параметри.
Как да вмъкна изрични стойности в колоната за идентичност на SQL Server?
По подразбиране свойството identity не ни позволява да вмъкваме изрични стойности в колоните за идентичност. Ако се опитате да вмъкнете изрични стойности в колона за идентичност, ще изпитате следната грешка.
ПУСНЕТЕ ТАБЛИЦА, АКО СЪЩЕСТВУВА TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))ВЪВЕДЕТЕ В TestIdentityVALUES (1,'Първият вмъкнат ред')
Съобщение 8101, ниво 16, състояние 1, ред 9
Изрична стойност за колоната за идентичност в таблица, „TestIdentity“ може да се посочи само когато се използва списък с колони и IDENTITY_INSERT е ВКЛЮЧЕНО.
Можем да преодолеем тази грешка, като активираме функцията IDENTITY_INSERT на таблицата. Сега ще променим инструкцията за вмъкване, както следва.
Таблица за отпадане, ако съществува testidentityCreate table testidentity (id int identity (1,1), col1 varchar (100)) Задаване на идентификация_insert testIdentity oninsert в testIdentity (id, col1) стойности (1, „първият вмъкнат ред“) Задайте идентичност_insert TestIdentity OFFSELECT * FROM TestIdentity
Друг ключов момент по този проблем е, че трябва да напишем списък с колони за вмъкване на израза. Ако не направим това, ще изпитаме следната грешка.
ПРОСТАНЕ ТАБЛИЦА, АКО СЪЩЕСТВУВА TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity VALUES (1,'Първият вмъкнат ред')INSERT IDENTITY OFF>
Съобщение 8101, ниво 16, състояние 1, ред 9
Изрична стойност за колоната за идентичност в таблица, „TestIdentity“ може да се посочи само когато се използва списък с колони и IDENTITY_INSERT е ВКЛЮЧЕНО.Тази грешка дефинира, че списъкът с колони липсва в оператора за вмъкване. В изявлението за вмъкване по-долу ще коригираме тази грешка.
ПРОСТАНЕ ТАБЛИЦА, АКО СЪЩЕСТВУВА TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) ---колона вмъкнат ред VALUES (първият вмъкнат ред VALUES ')ИЗКЛЮЧЕТЕ IDENTITY_INSERT TestIdentity
В някои случаи трябва да вмъкнем данни в една таблица от друга таблица. Един от най-добрите начини за извършване на тази операция е да използвате изразите „INSERT INTO SELECT“. Въпреки това, ако целевата таблица има колона за идентичност, трябва да активираме опцията IDENTITY_INSERT в целевата таблица. Освен това трябва да напишем списъка с колони на целевата таблица.
ПРОПУСКАНЕ ТАБЛИЦА, АКО СЪЩЕСТВУВА TestIdentity ИЗПУСКАНЕ ТАБЛИЦА, АКО СЪЩЕСТВУВА Таблица с източник СЪЗДАВАНЕ НА ТАБЛИЦА ТАБЛИЦА с източник (ID INT,Val1 VARCHAR(100))INSERT INTO SourceTable VALUES (1,'First Row'),(2,'Second Row')GOCREATE TABLE Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) SELECT * FROM SourceTableSET IDENTITY_INSERT TestIdentity OFF
Недостатъкът на опцията IDENTITY_INSERT е, че тя може да причини празнина между стойностите на колоната за идентичност. Изявление, подобно на следното, ще генерира празнина между стойностите на колоните за идентичност.
ПРОСТАНЕ ТАБЛИЦА, АКО СЪЩЕСТВУВА TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))INSERT INTO TestIdentity ---column listVALUES ('Първият вмъкнат ред (INDENTITY_INSERTENT_OFF)')ЗАДАВАНЕТО TestIdentity (Id,Col1) ---column listVALUES (90,'Вторият вмъкнат ред (INDENTITY_INSERT_ON')SET IDENTITY_INSERT TestIdentity OFFINSERT INTO TestIdentity ---column listVALUES ('Третият вмъкнат ред (INDENTITY_INSERT_OFF) TestI') /предварително>
Команда DBCC CHECKIDENT
Командата DBCC CHECKIDENT ни позволява да получим подробности за последната стойност на колоната за идентичност. Тази функция също така позволява нулиране и промяна на текущата стойност на колоната за идентичност на друга стойност. Сега ще получим последната стойност на самоличността чрез командата DBCC CHECKIDENT.
ПУСНЕТЕ ТАБЛИЦА, АКО СЪЩЕСТВУВА TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('Първият вмъкнат ред')INSERT INTO TestIdentityVALUES ('Вторият вмъкнат ред В TestIdentityVALUES ('Третият вмъкнат ред')INSERT INTO TestIdentityVALUES ('Четвъртият вмъкнат ред')DBCC CHECKIDENT ('TestIdentity', NORESEED)
Друга опция за командата DBCC CHECKIDENT е нулиране на колоната за идентичност на необходимата стойност. В следващия пример параметърът RESEED променя максималната стойност на колоната за идентичност на 100 и вмъкнатите впоследствие стойности използват тази максимална стойност.
ПУСНЕТЕ ТАБЛИЦА, АКО СЪЩЕСТВУВА TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('Първият вмъкнат ред')INSERT INTO TestIdentityVALUES ('Вторият вмъкнат ред В TestIdentityVALUES ('Третият вмъкнат ред')INSERT INTO TestIdentityVALUES ('Четвъртият вмъкнат ред')GODBCC CHECKIDENT ('TestIdentity',RESEED,100)GOINSERT INTO TestIdentityVALUES ('Петият вмъкнат ред')SELECT * FROM TestIdentity
Колона за идентичност и уникалност на SQL Server
Колоните за идентичност не гарантират генерирането на уникални стойности. Това е често срещаният объркващ проблем за колоните за идентичност, така че ако искаме да гарантираме уникалността на генерираните стойности, можем да използваме уникалния индекс за тези колони. Сега ще докажем и демонстрираме как да създаваме дублиращи се стойности върху колоните за идентичност.
ПУСНЕТЕ ТАБЛИЦА, АКО СЪЩЕСТВУВА TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1)VALUES (1,'Първият вмъкнат INDENTITY_INSERT) )INSERT INTO TestIdentity (Id,Col1)VALUES (1,'Първият вмъкнат ред (INDENTITY_INSERT_OFF)')SET IDENTITY_INSERT TestIdentity OFFSELECT * FROM TestIdentity
Освен това колоните за идентичност и първичните ключове са два различни обекта в SQL Server. Целта на използването на колоната за идентичност е да генерира автоматично увеличеното число. От друга страна, ограничението на първичния ключ гарантира и осигурява уникалността на стойностите в определена колона. Ограничението за първичен ключ налага уникалните стойности за дефинираните колони, тъй като по подразбиране първичният ключ създава клъстериран уникален индекс в таблицата. При обичайната употреба ограничението на първичния ключ и свойството на идентичност могат да се използват заедно. Този подход на използване ни помага да внесем гъвкавостта на уникалността на първичния ключ и функцията за автоматично увеличаване на идентичността към приложената колона. В следващия пример ще добавим също ограничение за първичен ключ към колоната Id и това ще предотврати дублирането на вмъкнати стойности.
ПУСНЕТЕ ТАБЛИЦА, АКО СЪЩЕСТВУВА TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) PRIMARY KEY,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1)Първият вмъкнат VALUES (1,'INDENTSOFF_IN) )')INSERT INTO TestIdentity (Id,Col1)VALUES (1,'Първият вмъкнат ред (INDENTITY_INSERT_OFF)')SET IDENTITY_INSERT TestIdentity OFFSELECT * FROM TestIdentity
Когато навигираме в раздела Индекси на таблицата TestIdentity в изследователя на обекти, можем да открием уникален клъстериран индекс, създаден чрез ограничение на първичния ключ. Това ограничение налага уникални стойности за колона Id.
Заключение
В тази статия обсъдихме основните концепции и методи за използване на свойството на SQL Server Identity и колоните за идентичност.
Препратки
- СЪЗДАВАНЕ НА ТАБЛИЦА (Transact-SQL) ИДЕНТИЧНОСТ (Свойство)
- Създаване на първични ключове