Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wprowadzenie do tożsamości SQL Server

W tym artykule omówimy podstawy i szczegóły dotyczące właściwości IDENTITY programu SQL Server oraz funkcji kolumny IDENTITY. Zastanowimy się również, jak wstawić jawne wartości do kolumn tożsamości za pomocą funkcji IDENTITY_INSERT.

Wprowadzenie do właściwości SQL Server IDENTITY i kolumny IDENTITY

W SQL Server właściwość identity pozwala na tworzenie kolumn tożsamości w tabelach SQL Server zgodnie z ustawieniami składni właściwości identity. Składnia właściwości tożsamości wygląda następująco i stosujemy tę składnię do tworzenia lub zmiany instrukcji tabeli.

TOŻSAMOŚĆ [(ziarno, przyrost)]

Najpierw przyjrzymy się parametrom właściwości tożsamości. Ta właściwość przyjmuje dwa parametry wejściowe:pierwszy to seed, a drugi to przyrost. Parametr seed określa, że ​​pierwsza wartość początkowa wstawianej wartości do tabeli, a parametr Increment określa wartość inkrementacji wstawionych danych.

Teraz zintensyfikujemy tę podstawową definicję własności tożsamości za pomocą kilku przykładów.

Jak utworzyć kolumnę tożsamości w SQL Server

Przykład 1 :W poniższym przykładzie utworzymy kolumnę tożsamości, a pierwsza wartość zacznie się od 1 i zwiększy się o 1 o 1.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))

GO

INSERT INTO TestIdentity
VALUES ('The first inserted row')

INSERT INTO TestIdentity
VALUES ('The second inserted row')

INSERT INTO TestIdentity
VALUES ('The third inserted row')

INSERT INTO TestIdentity
VALUES ('The fourth inserted row')

SELECT Id as [IdentityColumn],Col1 FROM TestIdentity

Przykład 2 :W poniższym przykładzie utworzymy kolumnę tożsamości, a pierwsza wartość zacznie się od 37 i zwiększy 20 o 20.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(37,20) ,
Col1 VARCHAR(100))

GO

INSERT INTO TestIdentity
VALUES ('The first inserted row')

INSERT INTO TestIdentity
VALUES ('The second inserted row')

INSERT INTO TestIdentity
VALUES ('The third inserted row')

INSERT INTO TestIdentity
VALUES ('The fourth inserted row')

SELECT Id as [IdentityColumn],Col1 FROM TestIdentity

Jak widać w powyższym przykładzie, właściwość identity zapewnia generowanie wartości auto-inkrementacji zgodnie z parametrami seed i identity.

Jak wstawić jawne wartości do kolumny tożsamości SQL Server?

Domyślnie właściwość identity nie pozwala na wstawianie jawnych wartości do kolumn tożsamości. Jeśli spróbujesz wstawić jawne wartości do kolumny tożsamości, wystąpi następujący błąd.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))

GO

INSERT INTO TestIdentity
VALUES (1,'The first inserted row')

Wiadomość 8101, poziom 16, stan 1, wiersz 9
Wyraźna wartość kolumny tożsamości w table, „TestIdentity” można określić tylko wtedy, gdy używana jest lista kolumn, a IDENTITY_INSERT jest WŁĄCZONE.

Możemy obejść ten błąd, włączając funkcję IDENTITY_INSERT tabeli. Teraz zmienimy instrukcję insert w następujący sposób.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))

SET IDENTITY_INSERT TestIdentity ON

INSERT INTO TestIdentity (Id,Col1)  
VALUES (1,'The first inserted row')

SET IDENTITY_INSERT TestIdentity OFF

SELECT * FROM TestIdentity

Inną kluczową kwestią dotyczącą tego problemu jest to, że musimy napisać listę kolumn do instrukcji wstawiania. Jeśli tego nie zrobimy, wystąpi następujący błąd.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))

SET IDENTITY_INSERT TestIdentity ON

INSERT INTO TestIdentity   
VALUES (1,'The first inserted row')

SET IDENTITY_INSERT TestIdentity OFF

Wiadomość 8101, poziom 16, stan 1, wiersz 9
Wyraźna wartość kolumny tożsamości w table, „TestIdentity” można określić tylko wtedy, gdy używana jest lista kolumn, a IDENTITY_INSERT jest WŁĄCZONE.

Ten błąd określa, że ​​w instrukcji INSERT brakuje listy kolumn. W poniższym oświadczeniu insert naprawimy ten błąd.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))

SET IDENTITY_INSERT TestIdentity ON

INSERT INTO TestIdentity  (Id,Col1) ---column list
VALUES (90,'The first inserted row')

SET IDENTITY_INSERT TestIdentity OFF

W niektórych przypadkach musimy wstawić dane do jednej tabeli z innej tabeli. Jednym z najlepszych sposobów wykonania tej operacji jest użycie instrukcji „INSERT INTO SELECT”. Jeśli jednak tabela docelowa ma kolumnę tożsamości, musimy włączyć opcję IDENTITY_INSERT w tabeli docelowej. Ponadto musimy napisać listę kolumn tabeli docelowej.

DROP TABLE IF EXISTS TestIdentity
DROP TABLE IF EXISTS SourceTable 
CREATE TABLE SourceTable (ID INT,
Val1 VARCHAR(100))
INSERT INTO SourceTable 
VALUES (1,'First Row'),(2,'Second Row')
GO
CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))
SET IDENTITY_INSERT TestIdentity ON
INSERT INTO TestIdentity  (Id,Col1) 
SELECT * FROM SourceTable
SET IDENTITY_INSERT TestIdentity OFF

Wadą opcji IDENTITY_INSERT jest to, że może powodować lukę między wartościami kolumny tożsamości. Instrukcja podobna do poniższej wygeneruje lukę między wartościami kolumny tożsamości.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))

INSERT INTO TestIdentity  ---column list
VALUES ('The first inserted row (INDENTITY_INSERT_OFF)')

SET IDENTITY_INSERT TestIdentity ON

INSERT INTO TestIdentity  (Id,Col1) ---column list
VALUES (90,'The second inserted row (INDENTITY_INSERT_ON')

SET IDENTITY_INSERT TestIdentity OFF


INSERT INTO TestIdentity   ---column list
VALUES ('The third inserted row (INDENTITY_INSERT_OFF)')


SELECT * FROM TestIdentity

polecenie DBCC CHECKIDENT

Polecenie DBCC CHECKIDENT pozwala nam uzyskać szczegółowe informacje o ostatniej wartości kolumny tożsamości. Ta funkcja umożliwia również resetowanie i zmianę bieżącej wartości kolumny tożsamości na inną wartość. Teraz otrzymamy ostatnią wartość tożsamości za pomocą polecenia DBCC CHECKIDENT.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))

GO

INSERT INTO TestIdentity
VALUES ('The first inserted row')

INSERT INTO TestIdentity
VALUES ('The second inserted row')

INSERT INTO TestIdentity
VALUES ('The third inserted row')

INSERT INTO TestIdentity
VALUES ('The fourth inserted row')

DBCC CHECKIDENT ('TestIdentity', NORESEED)

Inną opcją dotyczącą polecenia DBCC CHECKIDENT jest zresetowanie kolumny tożsamości do wymaganej wartości. W poniższym przykładzie parametr RESEED zmienia maksymalną wartość kolumny tożsamości na 100, a kolejne wstawiane wartości używają tej wartości maksymalnej.

DROP TABLE IF EXISTS TestIdentity
CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))
GO
INSERT INTO TestIdentity
VALUES ('The first inserted row')
INSERT INTO TestIdentity
VALUES ('The second inserted row')
INSERT INTO TestIdentity
VALUES ('The third inserted row')
INSERT INTO TestIdentity
VALUES ('The fourth inserted row')
GO
DBCC CHECKIDENT ('TestIdentity',RESEED,100)
GO
INSERT INTO TestIdentity
VALUES ('The fifth inserted row')

SELECT  * FROM TestIdentity

Kolumna tożsamości i niepowtarzalność SQL Server

Kolumny tożsamości nie gwarantują generowania unikalnych wartości. Jest to typowy mylący problem dotyczący kolumn tożsamości, więc jeśli chcemy zapewnić unikalność generowanych wartości, możemy użyć unikalnego indeksu dla tych kolumn. Teraz udowodnimy i zademonstrujemy, jak tworzyć zduplikowane wartości w kolumnach tożsamości.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) ,
Col1 VARCHAR(100))
SET IDENTITY_INSERT TestIdentity ON
INSERT INTO TestIdentity  (Id,Col1)
VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)')

INSERT INTO TestIdentity  (Id,Col1)
VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)')


SET IDENTITY_INSERT TestIdentity OFF


SELECT  * FROM TestIdentity

Ponadto kolumny tożsamości i klucze podstawowe to dwa odmienne obiekty w SQL Server. Celem użycia kolumny tożsamości jest generowanie automatycznie zwiększanej liczby. Z drugiej strony ograniczenie klucza podstawowego gwarantuje i zapewnia unikalność wartości w określonej kolumnie. Ograniczenie klucza podstawowego wymusza unikatowe wartości dla zdefiniowanych kolumn, ponieważ domyślnie klucz podstawowy tworzy klastrowany unikatowy indeks w tabeli. W powszechnym użyciu ograniczenie klucza podstawowego i właściwość tożsamości mogą być używane razem. Takie podejście do użycia pomaga nam zapewnić elastyczność unikatowości klucza podstawowego i funkcji automatycznego zwiększania tożsamości w zastosowanej kolumnie. W poniższym przykładzie dodamy również ograniczenie klucza podstawowego do kolumny Id, co zapobiegnie duplikowaniu wstawionych wartości.

DROP TABLE IF EXISTS TestIdentity

CREATE TABLE TestIdentity
(Id INT IDENTITY(1,1) PRIMARY KEY,
Col1 VARCHAR(100))
SET IDENTITY_INSERT TestIdentity ON
INSERT INTO TestIdentity  (Id,Col1)
VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)')

INSERT INTO TestIdentity  (Id,Col1)
VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)')
SET IDENTITY_INSERT TestIdentity OFF


SELECT  * FROM TestIdentity

Kiedy poruszamy się po karcie Indeksy tabeli TestIdentity w eksploratorze obiektów, możemy znaleźć unikalny indeks klastrowy, który został utworzony przez ograniczenie klucza podstawowego. To ograniczenie wymusza unikalne wartości dla kolumny Id.

Wniosek

W tym artykule omówiliśmy podstawowe koncepcje i metody użycia właściwości tożsamości SQL Server i kolumn tożsamości.

Referencje

  • CREATE TABLE (Transact-SQL) TOŻSAMOŚĆ (Właściwość)
  • Utwórz klucze podstawowe

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę zmienić ograniczenie klucza podstawowego za pomocą składni SQL?

  2. Tworzenie indeksu ciągów z kodem jako pierwszy

  3. JSON_MODIFY() Przykłady w SQL Server (T-SQL)

  4. Co właściwie oznacza indeks klastrowy i nieklastrowy?

  5. Co zrobić z typem oczekiwania ASYNC NETWORK IO?