sql >> Database teknologi >  >> RDS >> Sqlserver

Introduktion til SQL Server Identity

I denne artikel vil vi udforske det grundlæggende og detaljer om SQL Server IDENTITY-egenskaben og IDENTITY-kolonnefunktionerne. Vi vil også overveje, hvordan man indsætter eksplicitte værdier i identitetskolonnerne gennem IDENTITY_INSERT-funktionen.

Introduktion til SQL Server IDENTITY-egenskab og IDENTITY-kolonne

I SQL Server giver identitetsegenskaben os mulighed for at oprette identitetskolonner i SQL Server-tabellerne i henhold til indstillingerne for identitetsegenskabens syntaks. Syntaksen for identitetsegenskaben ser ud som følger, og vi anvender denne syntaks til at oprette eller ændre en tabelsætning.

IDENTITET [(frø, stigning)]

Først vil vi undersøge parametrene for identitetsejendommen. Denne egenskab tager to inputparametre:den første er seed og den anden er inkrement. Seed-parameteren angiver, at den første startværdi af den indsatte værdi i tabellen, og inkrement-parameteren definerer stigningsværdien af ​​de indsatte data.

Nu vil vi intensivere denne principielle definition af identitetsegenskab med nogle eksempler.

Sådan opretter du en identitetskolonne i SQL Server

Eksempel-1 :I det følgende eksempel vil vi oprette en identitetskolonne, og den første værdi starter fra 1 og stiger 1 med 1.

DROP TABEL HVIS EKSISTERER TestIdentityCREATE TABEL TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('Den første indsatte række')INSERT INTO TestIdentityserted INTO 2.Ind. TestIdentityVALUES ('Den tredje indsatte række')INSERT INTO TestIdentityVALUES ('Den fjerde indsatte række')VÆLG Id som [IdentityColumn],Col1 FROM TestIdentity

Eksempel-2 :I det følgende eksempel vil vi oprette en identitetskolonne, og den første værdi starter fra 37 og stiger 20 med 20.

DROP TABEL HVIS EKSISTERER TestIdentityCREATE TABEL TestIdentity(Id INT IDENTITY(37,20) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('Den første indsatte række')INSERT INTO TestIdentity'secondentindsæt')INSERT INTOTherown TestIdentityVALUES ('Den tredje indsatte række')INSERT INTO TestIdentityVALUES ('Den fjerde indsatte række')VÆLG Id som [IdentityColumn],Col1 FROM TestIdentity

Som du kan se i ovenstående eksempel, giver identitetsegenskaben generering af auto-increment-værdierne i henhold til frø- og identitetsparametre.

Hvordan indsætter man eksplicitte værdier i SQL Server-identitetskolonnen?

Som standard tillader identitetsegenskaber os ikke at indsætte eksplicitte værdier i identitetskolonnerne. Hvis du forsøger at indsætte eksplicitte værdier i en identitetskolonne, vil du opleve følgende fejl.

DROP TABEL HVIS EKSISTERER TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES (1,'Den første indsatte række')

Besked 8101, niveau 16, tilstand 1, linje 9
En eksplicit værdi for identitetskolonnen i tabel, 'TestIdentity' kan kun angives, når der bruges en kolonneliste, og IDENTITY_INSERT er TIL.

Vi kan overvinde denne fejl ved at aktivere funktionen IDENTITY_INSERT i tabellen. Nu vil vi ændre insert-sætningen som følger.

DROP TABEL HVIS EKSISTERER TestIdentityCREATE TABEL TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) VALUES (1,'ENT INSERTIDITY INSERT') TestIdentity OFFSELECT * FRA TestIdentity

Et andet nøglepunkt ved dette problem er, at vi skal skrive en kolonneliste for at indsætte erklæringen. Hvis vi ikke gør dette, vil vi opleve følgende fejl.

DROP TABEL HVIS FINDER TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity VALUES (1,'Den første indsatte test-IDENTITY_')> 

Besked 8101, niveau 16, tilstand 1, linje 9
En eksplicit værdi for identitetskolonnen i tabel, 'TestIdentity' kan kun angives, når der bruges en kolonneliste, og IDENTITY_INSERT er TIL.

Denne fejl definerer, at kolonnelisten mangler i insert-sætningen. I nedenstående indsættelseserklæring vil vi rette denne fejl.

DROP TABEL HVIS FINDER TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) ---columnted,The first insert in rows (9 ')SÆT IDENTITY_INSERT TestIdentity FRA

I nogle tilfælde skal vi indsætte data til en tabel fra en anden tabel. En af de bedste måder at udføre denne operation på er at bruge "INSERT INTO SELECT"-sætningerne. Men hvis måltabellen har en identitetskolonne, skal vi aktivere IDENTITY_INSERT-indstillingen i måltabellen. Vi skal også skrive kolonnelisten for måltabellen.

DROP TABEL HVIS EKSISTERER TestIdentity DROP TABEL HVIS EKSISTERER Kildetabel OPRET TABEL Kildetabel (ID INT,Val1 VARCHAR(100))INDSÆT I KILDETABELVÆRDIER (1,'Første Række'),(2,'Anden Række TABLEGOC) Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) SELECT * FRA SourceTableSET IDENTITY_INSERT TestIdentity OFF

Ulempen ved IDENTITY_INSERT-indstillingen er, at den kan forårsage et hul mellem identitetskolonnens værdier. En sætning, der ligner den følgende, vil generere et hul mellem identitetskolonnens værdier.

DROP TABEL HVIS EKSISTERER TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))INSERT INTO TestIdentity ---column listVALUES ('Den første indsatte række (INDENTITY_INSERTIENTITY_OFF)INSERTONTESTIDENTITY_INSERTONTESTIDENTITY_tINSERTON') TestIdentity (Id,Col1) ---column listVALUES (90,'Den anden indsatte række (INDENTITY_INSERT_ON')SET IDENTITY_INSERT TestIdentity OFFINSERT INTO TestIdentity ---column listVALUES ('Den tredje indsatte række (INDENTITY_INSERT_TESTI 

DBCC CHECKIDENT kommando

Kommandoen DBCC CHECKIDENT giver os mulighed for at få detaljer om identitetskolonnens sidste værdi. Denne funktion gør det også muligt at nulstille og ændre identitetskolonnens aktuelle værdi til en anden værdi. Nu vil vi få den sidste værdi af identiteten gennem kommandoen DBCC CHECKIDENT.

DROP TABEL HVIS EKSISTERER TestIdentityCREATE TABEL TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('Den første indsatte række')INSERT INTO TestIdentityserted INTO 2.Ind. TestIdentityVALUES ('Den tredje indsatte række')INSERT INTO TestIdentityVALUES ('Den fjerde indsatte række')DBCC CHECKIDENT ('TestIdentity', NORESEED)

En anden mulighed for kommandoen DBCC CHECKIDENT er at nulstille identitetskolonnen til en påkrævet værdi. I det følgende eksempel ændrer RESEED-parameteren maks. værdien af ​​identitetskolonnen til 100, og de efterfølgende indsatte værdier bruger denne maks. værdi.

DROP TABEL HVIS EKSISTERER TestIdentityCREATE TABEL TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('Den første indsatte række')INSERT INTO TestIdentityserted INTO 2.Ind. TestIdentityVALUES ('Den tredje indsatte række')INSERT INTO TestIdentityVALUES ('Den fjerde indsatte række')GODBCC CHECKIDENT ('TestIdentity',RESEED,100)GOINSERT INTO TestIdentityVALUES ('Den femte indsatte række')Presidentity SELECTity *FRA 

SQL Server-identitetskolonne og unikhed

Identitetskolonner garanterer ikke generering af unikke værdier. Dette er det almindelige forvirrende problem med identitetskolonnerne, så hvis vi ønsker at sikre unikheden af ​​de genererede værdier, kan vi bruge det unikke indeks for disse kolonner. Nu vil vi bevise og demonstrere, hvordan du opretter duplikerede værdier over identitetskolonnerne.

DROP TABEL HVIS EKSISTERER TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1)VALUES (1,'Den første række_INDSENTER) )INSERT INTO TestIdentity (Id,Col1)VALUES (1,'Den første indsatte række (INDENTITY_INSERT_OFF)')SET IDENTITY_INSERT TestIdentity OFFSELECT * FRA TestIdentity

Derudover er identitetskolonner og primærnøgler to forskellige objekter i SQL Server. Brugsformålet med identitetskolonnen er at generere det auto-inkrementerede nummer. På den anden side garanterer og giver den primære nøglebegrænsning værdierne i en bestemt kolonne entydigt. Primærnøgle-begrænsningen gennemtvinger de unikke værdier for de definerede kolonner, fordi primærnøgle som standard opretter et klynget unikt indeks i tabellen. I almindelig brug kan den primære nøgle-begrænsning og identitetsegenskaben bruges sammen. Denne brugstilgang hjælper os med at bringe fleksibiliteten i den primære nøgles unikke karakter og funktionen Identitets auto-increment til den anvendte kolonne. I det følgende eksempel vil vi også tilføje en primær nøglebegrænsning til Id-kolonnen, og den vil forhindre at duplikere indsatte værdier.

DROP TABEL HVIS EKSISTERER TestIdentityCREATE TABEL TestIdentity(Id INT IDENTITY(1,1) PRIMARY KEY,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1)INSERT_INDENTITY(1,INDSÆTET_RÆKKE) )')INSERT INTO TestIdentity (Id,Col1)VALUES (1,'Den første indsatte række (INDENTITY_INSERT_OFF)')SET IDENTITY_INSERT TestIdentity OFFSELECT * FROM TestIdentity

Når vi navigerer på fanen Indekser i TestIdentity-tabellen i objektudforskeren, kan vi finde ud af et unikt klynget indeks, der er skabt af primærnøglebegrænsning. Denne begrænsning håndhæver unikke værdier for Id-kolonnen.

Konklusion

I denne artikel diskuterede vi de grundlæggende begreber og brugsmetoder for SQL Server Identity-egenskaber og Identity-kolonner.

Referencer

  • OPRET TABEL (Transact-SQL) IDENTITET (Ejendom)
  • Opret primære nøgler

  1. Jeg vil bruge CASE-sætning til at opdatere nogle poster i sql server 2005

  2. Hvordan bruger man CASE Statement i MySQL?

  3. Sådan krypteres data i Oracle ved hjælp af PL SQL

  4. Ændre en MySQL-kolonne til at være AUTO_INCREMENT