logo

SQL Server IDENTITET

IDENTITY-nøkkelordet er en egenskap i SQL Server. Når en tabellkolonne er definert med en identitetsegenskap, vil verdien være automatisk generert inkrementell verdi . Denne verdien opprettes automatisk av serveren. Derfor kan vi ikke manuelt legge inn en verdi i en identitetskolonne som bruker. Derfor, hvis vi merker en kolonne som identitet, vil SQL Server fylle den på en automatisk inkrementeringsmåte.

Syntaks

Følgende er syntaksen for å illustrere bruken av IDENTITY-egenskapen i SQL Server:

 IDENTITY[(seed, increment)] 

Syntaksparametrene ovenfor er forklart nedenfor:

    Frø:Den indikerer startverdien for raden som er lastet inn i tabellen. Som standard er verdien 1.Økning:Den angir den inkrementelle verdien, som legges til identitetsverdien til den sist lastede raden. Som standard er verdien 1.

La oss forstå dette konseptet gjennom et enkelt eksempel.

Anta at vi har en ' Student ' bord, og vi vil ha Student ID genereres automatisk. Vi har en begynnende student-ID av 10 og ønsker å øke den med 1 for hver ny ID. I dette scenariet må følgende verdier defineres.

Frø: 10

Økning: 1

 CREATE TABLE Student ( StudentID INT IDENTITY(10, 1) PRIMARY KEY NOT NULL, ) 

MERK: Bare én identifikasjonskolonne er tillatt per tabell i SQL Server.

Eksempel på SQL Server IDENTITY

La oss forstå hvordan vi kan bruke identitetsegenskapen i tabellen. Identitetsegenskapen i en kolonne kan angis enten når den nye tabellen opprettes eller etter at den er opprettet. Her skal vi se begge tilfellene med eksempler.

IDENTITY-eiendom med ny tabell

Følgende setning vil opprette en ny tabell med identitetsegenskapen i den angitte databasen:

 CREATE TABLE person ( PersonID INT IDENTITY(10,1) PRIMARY KEY NOT NULL, Fullname VARCHAR(100) NOT NULL, Occupation VARCHAR(50), Gender VARCHAR(10) NOT NULL ); 

Deretter vil vi sette inn en ny rad i denne tabellen med en PRODUKSJON klausul for å se den autogenererte person-IDen:

 INSERT INTO person(Fullname, Occupation, Gender) OUTPUT inserted.PersonID VALUES('Sara Jackson', 'HR', 'Female'); 

Utførelse av denne spørringen vil vise utdataene nedenfor:

SQL Server IDENTITET

Denne utgangen viser at den første raden er satt inn med verdien ti i PersonID kolonne som spesifisert i tabelldefinisjonsidentitetskolonnen.

La oss sette inn en annen rad i person bord som Nedenfor:

 INSERT INTO person(Fullname, Occupation, Gender) OUTPUT inserted.* VALUES('Mark Boucher', 'Cricketer', 'Male'), ('Josh Phillip', 'Writer', 'Male'); 

Denne spørringen vil returnere følgende utdata:

SQL Server IDENTITET

Denne utgangen viser at den andre raden er satt inn med verdien 11 og den tredje raden med verdien 12 i PersonID-kolonnen.

IDENTITY-egenskap med eksisterende tabell

Vi vil forklare dette konseptet ved først å slette tabellen ovenfor og lage dem uten identitetsegenskap. Utfør setningen nedenfor for å slippe tabellen:

 DROP TABLE person; 

Deretter lager vi en tabell ved å bruke spørringen nedenfor:

 CREATE TABLE person ( Fullname VARCHAR(100) NOT NULL, Occupation VARCHAR(50), Gender VARCHAR(10) NOT NULL ); 

Hvis vi ønsker å legge til en ny kolonne med identitetsegenskapen i en eksisterende tabell, må vi bruke ALTER-kommandoen. Spørringen nedenfor vil legge til PersonID som en identitetskolonne i persontabellen:

 ALTER TABLE person ADD PersonID INT IDENTITY(10,1) PRIMARY KEY NOT NULL; 

Legger eksplisitt til verdi i identitetskolonnen

Hvis vi legger til en ny rad i tabellen ovenfor ved å spesifisere identitetskolonnen eksplisitt, vil SQL Server gi en feil. Se spørringen nedenfor:

 INSERT INTO person(Fullname, Occupation, Gender, PersonID) VALUES('Mary Smith', 'Business Analyst', 'Female', 13); 

Utførelse av denne spørringen vil gjennom følgende feil:

SQL Server IDENTITET

For å sette inn identitetskolonneverdien eksplisitt, må vi først sette IDENTITY_INSERT-verdien PÅ. Utfør deretter insert-operasjonen for å legge til en ny rad i tabellen og sett deretter IDENTITY_INSERT-verdien AV. Se kodeskriptet nedenfor:

 SET IDENTITY_INSERT person ON /*INSERT VALUE*/ INSERT INTO person(Fullname, Occupation, Gender, PersonID) VALUES('Mary Smith', 'Business Analyst', 'Female', 14); SET IDENTITY_INSERT person OFF SELECT * FROM person; 

IDENTITY_INSERT PÅ lar brukere legge data inn i identitetskolonner, mens IDENTITY_INSERT AV hindrer dem i å tilføre verdi til denne kolonnen.

Utførelse av kodeskriptet vil vise utdataene nedenfor der vi kan se at PersonID med verdi 14 er satt inn.

SQL Server IDENTITET

IDENTITET-funksjon

SQL Server gir noen identitetsfunksjoner for å arbeide med IDENTITY-kolonnene i en tabell. Disse identitetsfunksjonene er listet opp nedenfor:

  1. @@IDENTITY-funksjon
  2. SCOPE_IDENTITY() funksjon
  3. IDENT_CURRENT funksjon
  4. IDENTITET-funksjon

La oss ta en titt på IDENTITET-funksjonene med noen eksempler.

@@IDENTITY-funksjon

@@IDENTITY er en systemdefinert funksjon som viser den siste identitetsverdien (maksimal brukt identitetsverdi) opprettet i en tabell for IDENTITY-kolonnen i samme økt. Denne funksjonskolonnen returnerer identitetsverdien generert av setningen etter å ha satt inn en ny oppføring i en tabell. Den returnerer en NULL verdi når vi utfører en spørring som ikke skaper IDENTITY-verdier. Det fungerer alltid innenfor rammen av gjeldende økt. Den kan ikke brukes eksternt.

Eksempel

Anta at vi har den gjeldende maksimale identitetsverdien i persontabellen er 13. Nå vil vi legge til én post i samme økt som øker identitetsverdien med én. Deretter vil vi bruke @@IDENTITY-funksjonen for å få den siste identitetsverdien opprettet i samme økt.

Her er hele kodeskriptet:

 SELECT MAX(PersonID) AS maxidentity FROM person; INSERT INTO person(Fullname, Occupation, Gender) VALUES('Brian Lara', 'Cricket', 'Male'); SELECT @@IDENTITY; 

Utførelse av skriptet vil returnere følgende utdata der vi kan se maksimalt brukt identitetsverdi er 14.

SQL Server IDENTITET

SCOPE_IDENTITY() funksjon

SCOPE_IDENTITY() er en systemdefinert funksjon til vise den nyeste identitetsverdien i en tabell under gjeldende omfang. Dette omfanget kan være en modul, trigger, funksjon eller en lagret prosedyre. Den ligner på @@IDENTITY()-funksjonen, bortsett fra at denne funksjonen bare har et begrenset omfang. SCOPE_IDENTITY-funksjonen returnerer NULL hvis vi utfører den før innsettingsoperasjonen som genererer en verdi i samme omfang.

Eksempel

Koden nedenfor bruker både @@IDENTITY og SCOPE_IDENTITY() funksjonen i samme økt. Dette eksemplet vil først vise den siste identitetsverdien, og deretter sette inn én rad i tabellen. Deretter utfører den begge identitetsfunksjonene.

 SELECT MAX(PersonID) AS maxid FROM person; INSERT INTO person(Fullname, Occupation, Gender) VALUES('Jennifer Winset', 'Actoress', 'Female'); SELECT SCOPE_IDENTITY(); SELECT @@IDENTITY; 

Utførelse av koden vil vise samme verdi i gjeldende økt og lignende omfang. Se utdatabildet nedenfor:

SQL Server IDENTITET

Nå skal vi se hvordan begge funksjonene er forskjellige med et eksempel. Først vil vi lage to navngitte tabeller ansattdata og avdeling ved å bruke utsagnet nedenfor:

 CREATE TABLE employee_data ( emp_id INT IDENTITY(1, 1) PRIMARY KEY NOT NULL, fullname VARCHAR(20) NULL ) GO CREATE TABLE department ( department_id INT IDENTITY(100, 5) PRIMARY KEY, department_name VARCHAR(20) NULL ); 

Deretter oppretter vi en INSERT-utløser på tabellen medarbeiderdata. Denne utløseren påkalles for å sette inn en rad i avdelingstabellen hver gang vi setter inn en rad i tabellen medarbeiderdata.

Spørringen nedenfor oppretter en trigger for å sette inn en standardverdi 'DEN' i avdelingstabellen på hver innsettingsspørring i ansattdatatabellen:

skuespiller zeenat aman
 CREATE TRIGGER Insert_Department ON employee_data FOR INSERT AS BEGIN INSERT INTO department VALUES ('IT') END; 

Etter å ha opprettet en utløser, skal vi sette inn én post i ansattdatatabellen og se utdataene fra både @@IDENTITY og SCOPE_IDENTITY() funksjoner.

 INSERT INTO employee_data VALUES ('John Mathew'); 

Utførelse av spørringen vil legge til én rad i tabellen medarbeiderdata og generere en identitetsverdi i samme økt. Når insert-spørringen er utført i tabellen medarbeiderdata, kaller den automatisk en utløser for å legge til én rad i avdelingstabellen. Identitetsfrøverdien er 1 for ansattdataene og 100 for avdelingstabellen.

Til slutt utfører vi setningene nedenfor som viser utdata 100 for SELECT @@IDENTITY-funksjonen og 1 for SCOPE_IDENTITY-funksjonen fordi de bare returnerer identitetsverdi i samme omfang.

 SELECT MAX(emp_id) FROM employee_data SELECT MAX(department_id) FROM department SELECT @@IDENTITY SELECT SCOPE_IDENTITY() 

Her er resultatet:

SQL Server IDENTITET

IDENT_CURRENT() funksjon

IDENT_CURRENT er en systemdefinert funksjon til vise den nyeste IDENTITY-verdien generert for en gitt tabell under enhver tilkobling. Denne funksjonen tar ikke hensyn til omfanget av SQL-spørringen som skaper identitetsverdien. Denne funksjonen krever tabellnavnet som vi ønsker å få identitetsverdien for.

Eksempel

Vi kan forstå det ved først å åpne de to koblingsvinduene. Vi vil sette inn én post i det første vinduet som genererer identitetsverdien 15 i persontabellen. Deretter kan vi bekrefte denne identitetsverdien i et annet tilkoblingsvindu der vi kan se den samme utgangen. Her er hele koden:

 1st Connection Window INSERT INTO person(Fullname, Occupation, Gender) VALUES('John Doe', 'Engineer', 'Male'); GO SELECT MAX(PersonID) AS maxid FROM person; 2nd Connection Window SELECT MAX(PersonID) AS maxid FROM person; GO SELECT IDENT_CURRENT('person') AS identity_value; 

Utførelse av kodene ovenfor i to forskjellige vinduer vil vise samme identitetsverdi.

SQL Server IDENTITET

IDENTITY() funksjon

IDENTITY()-funksjonen er en systemdefinert funksjon brukes til å sette inn en identitetskolonne i en ny tabell . Denne funksjonen er forskjellig fra IDENTITY-egenskapen som vi bruker med CREATE TABLE- og ALTER TABLE-setningene. Vi kan bare bruke denne funksjonen i en SELECT INTO-setning, som brukes under overføring av data fra en tabell til en annen.

Følgende syntaks illustrerer bruken av denne funksjonen i SQL Server:

 IDENTITY (data_type , seed , increment) AS column_name 

Hvis en kildetabell har en IDENTITY-kolonne, arver tabellen som er dannet med en SELECT INTO-kommando den som standard. For eksempel , har vi tidligere opprettet en tabellperson med en identitetskolonne. Anta at vi lager en ny tabell som arver persontabellen ved å bruke SELECT INTO-setningene med IDENTITY()-funksjonen. I så fall vil vi få en feil fordi kildetabellen allerede har en identitetskolonne. Se spørringen nedenfor:

 SELECT IDENTITY(INT, 100, 2) AS NEW_ID, PersonID, Fullname, Occupation, Gender INTO person_info FROM person; 

Utførelse av setningen ovenfor vil returnere følgende feilmelding:

SQL Server IDENTITET

La oss lage en ny tabell uten identitetsegenskap ved å bruke setningen nedenfor:

 CREATE TABLE student_data ( roll_no INT PRIMARY KEY NOT NULL, fullname VARCHAR(20) NULL ) 

Kopier deretter denne tabellen ved å bruke SELECT INTO-setningen inkludert IDENTITY-funksjonen som følger:

 SELECT IDENTITY(INT, 100, 1) AS student_id, roll_no, fullname INTO temp_data FROM student_data; 

Når setningen er utført, kan vi bekrefte den ved å bruke sp_hjelp kommando som viser tabellegenskaper.

SQL Server IDENTITET

Du kan se IDENTITET-kolonnen i FRISTENDE egenskaper i henhold til de angitte forholdene.

Hvis vi bruker denne funksjonen med SELECT-setningen, vil SQL Server gjennom følgende feilmelding:

Melding 177, nivå 15, tilstand 1, linje 2 IDENTITY-funksjonen kan bare brukes når SELECT-setningen har en INTO-klausul.

Gjenbruk av IDENTITY-verdier

Vi kan ikke gjenbruke identitetsverdiene i SQL Server-tabellen. Når vi sletter en rad fra identitetskolonnetabellen, vil det bli opprettet et gap i identitetskolonnen. SQL Server vil også skape et gap når vi setter inn en ny rad i identitetskolonnen, og setningen mislyktes eller rulles tilbake. Gapet indikerer at identitetsverdiene går tapt og ikke kan genereres igjen i IDENTITET-kolonnen.

Tenk på eksemplet nedenfor for å forstå det praktisk. Vi har allerede en persontabell som inneholder følgende data:

SQL Server IDENTITET

Deretter vil vi lage ytterligere to tabeller med navn 'posisjon' , og ' person_posisjon ' ved å bruke følgende utsagn:

 CREATE TABLE POSITION ( PositionID INT IDENTITY (1, 1) PRIMARY KEY, Position_name VARCHAR (255) NOT NULL ); CREATE TABLE person_position ( PersonID INT, PositionID INT, PRIMARY KEY (PersonID, PositionID), FOREIGN KEY (PersonID) REFERENCES person (PersonID), FOREIGN KEY (PositionID) REFERENCES POSITION (PositionID) ); 

Deretter prøver vi å sette inn en ny post i persontabellen og tilordne dem en posisjon ved å legge til en ny rad i person_position-tabellen. Vi vil gjøre dette ved å bruke transaksjonserklæringen som nedenfor:

 BEGIN TRANSACTION BEGIN TRY -- insert a new row into the person table INSERT INTO person (Fullname, Occupation, Gender) VALUES('Joan Smith', 'Manager', 'Male'); -- assign a position to a new person INSERT INTO person_position (PersonID, PositionID) VALUES(@@IDENTITY, 10); END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; END CATCH IF @@TRANCOUNT > 0 COMMIT TRANSACTION; 

Transaksjonskodeskriptet ovenfor utfører den første insert-setningen vellykket. Men den andre uttalelsen mislyktes siden det ikke var noen posisjon med id ti i posisjonstabellen. Derfor ble hele transaksjonen rullet tilbake.

Siden vi har maksimal identitetsverdi i PersonID-kolonnen er 16, forbrukte den første insert-setningen identitetsverdien 17, og deretter ble transaksjonen rullet tilbake. Derfor, hvis vi setter inn neste rad i Person-tabellen, vil neste identitetsverdi være 18. Utfør setningen nedenfor:

 INSERT INTO person(Fullname, Occupation, Gender) VALUES('Peter Drucker',' Writer', 'Female'); 

Etter å ha sjekket persontabellen på nytt, ser vi at den nylig tilføyde posten inneholder identitetsverdi 18.

SQL Server IDENTITET

To IDENTITY-kolonner i én enkelt tabell

Teknisk sett er det ikke mulig å lage to identitetskolonner i en enkelt tabell. Hvis vi gjør dette, gir SQL Server en feil. Se følgende spørring:

 CREATE TABLE TwoIdentityTable ( ID1 INT IDENTITY (10, 1) NOT NULL, ID2 INT IDENTITY (100, 1) NOT NULL ) 

Når vi kjører denne koden, vil vi se følgende feil:

SQL Server IDENTITET

Imidlertid kan vi opprette to identitetskolonner i en enkelt tabell ved å bruke den beregnede kolonnen. Følgende spørring oppretter en tabell med en beregnet kolonne som bruker den opprinnelige identitetskolonnen og reduserer den med 1.

 CREATE TABLE TwoIdentityTable ( ID1 INT IDENTITY (10, 1) NOT NULL, SecondID AS 10000-ID1, Descriptions VARCHAR(60) ) 

Deretter vil vi legge til noen data i denne tabellen ved å bruke kommandoen nedenfor:

 INSERT INTO TwoIdentityTable (Descriptions) VALUES ('Javatpoint provides best educational tutorials'), ('www.javatpoint.com') 

Til slutt sjekker vi tabelldataene ved å bruke SELECT-setningen. Den returnerer følgende utgang:

SQL Server IDENTITET

Vi kan se på bildet hvordan SecondID-kolonnen fungerer som en andre identitetskolonne, som reduseres med ti fra startverdien på 9990.

SQL Servers IDENTITY-kolonne feiloppfatninger

DBA-brukeren har mange misoppfatninger angående SQL Server-identitetskolonner. Følgende er listen over de vanligste misoppfatningene angående identitetskolonner som vil bli sett:

IDENTITY-kolonnen er UNIK: I følge SQL Servers offisielle dokumentasjon kan ikke identitetsegenskapen garantere at kolonneverdien er unik. Vi må bruke en PRIMÆRKØKKEL, UNIK begrensning eller UNIK indeks for å fremtvinge kolonneunikhet.

IDENTITY-kolonnen genererer fortløpende tall: Offisiell dokumentasjon sier tydelig at de tilordnede verdiene i identitetskolonnen kan gå tapt ved en databasefeil eller omstart av serveren. Det kan forårsake hull i identitetsverdien under innsetting. Gapet kan også opprettes når vi sletter verdien fra tabellen, eller insert-setningen rulles tilbake. Verdiene som genererer gap kan ikke brukes videre.

IDENTITY-kolonnen kan ikke automatisk generere eksisterende verdier: Det er ikke mulig for identitetskolonnen å automatisk generere eksisterende verdier før identitetsegenskapen er endret ved å bruke kommandoen DBCC CHECKIDENT. Den lar oss justere frøverdien (startverdien for raden) til identitetsegenskapen. Etter å ha utført denne kommandoen, vil ikke SQL Server sjekke de nyopprettede verdiene som allerede finnes i tabellen eller ikke.

IDENTITY-kolonnen som PRIMÆR NØKKEL er nok til å identifisere raden: Hvis en primærnøkkel inneholder identitetskolonnen i tabellen uten noen andre unike begrensninger, kan kolonnen lagre dupliserte verdier og forhindre kolonneunikk. Som vi vet kan ikke primærnøkkelen lagre duplikatverdier, men identitetskolonnen kan lagre duplikater; det anbefales å ikke bruke primærnøkkelen og identitetsegenskapen i samme kolonne.

Bruk av feil verktøy for å få tilbake identitetsverdier etter en innsetting: Det er også en vanlig misforståelse om uvitende om forskjellene mellom funksjonene @@IDENTITY, SCOPE_IDENTITY(), IDENT_CURRENT og IDENTITY() å få identitetsverdien direkte satt inn fra setningen vi nettopp har utført.

Forskjellen mellom SEKVENS og IDENTITET

Vi bruker både SEKVENS og IDENTITET for å generere automatiske tall. Imidlertid har den noen forskjeller, og hovedforskjellen er at identitet er tabellavhengig, mens sekvens ikke er det. La oss oppsummere forskjellene deres i tabellformen:

IDENTITET SEKVENS
Identitetsegenskapen brukes for en bestemt tabell og kan ikke deles med andre tabeller. En DBA definerer sekvensobjektet som kan deles mellom flere tabeller fordi det er uavhengig av en tabell.
Denne egenskapen genererer automatisk verdier hver gang insert-setningen kjøres på tabellen. Den bruker NEXT VALUE FOR-leddet for å generere neste verdi for et sekvensobjekt.
SQL Server tilbakestiller ikke kolonneverdien til identitetsegenskapen til den opprinnelige verdien. SQL Server kan tilbakestille verdien for sekvensobjektet.
Vi kan ikke angi maksimumsverdien for identitetseiendom. Vi kan sette maksimumsverdien for sekvensobjektet.
Den er introdusert i SQL Server 2000. Den er introdusert i SQL Server 2012.
Denne egenskapen kan ikke generere identitetsverdi i synkende rekkefølge. Den kan generere verdier i synkende rekkefølge.

Konklusjon

Denne artikkelen vil gi en fullstendig oversikt over IDENTITY-egenskapen i SQL Server. Her har vi lært hvordan og når identitetsegenskap brukes, dens forskjellige funksjoner, misoppfatninger og hvordan den er forskjellig fra sekvensen.