CREATE SEQUENCE (Transact-SQL)

  • 04/11/2017
  • 10 minutes to read
    • W
    • c
    • r
    • M
    • m
    • +7

Applies to: yesSQL Server (all supported versions) YesAzure SQL Database

Creates a sequence object and specifies its properties. En sekvens er et brugerdefineret skemabundet objekt, der genererer en sekvens af numeriske værdier i henhold til den specifikation, som sekvensen blev oprettet med. Sekvensen af numeriske værdier genereres i en stigende eller faldende rækkefølge med et defineret interval og kan konfigureres til at genstarte (cyklus), når den er opbrugt. Sekvenser, i modsætning til identitetskolonner, er ikke knyttet til specifikke tabeller. Applikationer henviser til et sekvensobjekt for at hente dets næste værdi. Forholdet mellem sekvenser og tabeller styres af applikationen. Brugerprogrammer kan referere til et sekvensobjekt og koordinere værdierne på tværs af flere rækker og tabeller.

I modsætning til identitetskolonner værdier, der genereres, når rækker indsættes, kan et program få det næste sekvensnummer uden at indsætte rækken ved at kalde den næste værdi for funktion. Brug sp_sekvens_get_range til at få flere sekvensnumre på en gang.

For oplysninger og scenarier, der bruger både Opret sekvens og den næste værdi for funktion, Se sekvensnumre.

Emnelink ikon Transact-Syntakskonventioner

syntaks

CREATE SEQUENCE sequence_name ] } | { NO MINVALUE } ] } | { NO MAXVALUE } ] } | { NO CACHE } ] 

Bemærk

for at se Transact-syntaks syntaks for Server 2014 og tidligere, Se tidligere versioner dokumentation.

argumenter

sekvensnavn
angiver det unikke navn, som sekvensen er kendt i databasen. Type er sysname.

angiver grænserne for sekvensobjektet. Standardminimumværdien for et nyt sekvensobjekt er minimumsværdien af datatypen for sekvensobjektet. Dette er nul for tinyint-datatypen og et negativt tal for alle andre datatyper.

egenskab, der angiver, om sekvensobjektet skal genstartes fra minimumsværdien (eller maksimum for faldende sekvensobjekter) eller kaste en undtagelse, når dens minimums-eller maksimumværdi overskrides. Standardcyklusindstillingen for nye sekvensobjekter er ingen cyklus.

Bemærk

Cykling en sekvens genstarter fra minimums-eller maksimumsværdien, ikke fra startværdien.

/ no CACHE]
øger ydeevnen for applikationer, der bruger sekvensobjekter ved at minimere antallet af disk IOs, der kræves for at generere sekvensnumre. Standard CACHE.

Hvis der f.eks. vælges en cache-størrelse på 50, beholder vi ikke 50 individuelle værdier cachelagret. Det cacher kun den aktuelle værdi og antallet af værdier, der er tilbage i cachen. Dette betyder, at den mængde hukommelse, der kræves for at gemme cachen, altid er to forekomster af datatypen for sekvensobjektet.

Bemærk

Hvis cache-indstillingen er aktiveret uden at angive en cache-størrelse, vælger databasemotoren En størrelse. Brugere bør dog ikke stole på, at valget er konsistent. Microsoft kan ændre metoden til beregning af cachestørrelsen uden varsel.

når der oprettes med CACHE-indstillingen, kan en uventet nedlukning (såsom strømsvigt) resultere i tab af sekvensnumre, der er tilbage i cachen.

Generelle bemærkninger

sekvensnumre genereres uden for rammerne af den aktuelle transaktion. De forbruges, uanset om transaktionen ved hjælp af sekvensnummeret er begået eller rullet tilbage. Duplikatvalidering sker kun, når en post er fuldt udfyldt. Dette kan resultere i nogle tilfælde, hvor det samme nummer bruges til mere end en post under oprettelsen, men derefter identificeres som en duplikat. Hvis dette sker, og andre autonummereringsværdier er blevet anvendt på efterfølgende poster, kan dette resultere i et mellemrum mellem autonummereringsværdier og forventet adfærd.

Cache management

for at forbedre ydeevnen, tildeler vi det antal sekvensnumre, der er angivet af CACHE-argumentet.

for eksempel oprettes en ny sekvens med en startværdi på 1 og en cache-størrelse på 15. Når den første værdi er nødvendig, stilles værdierne 1 til 15 til rådighed fra hukommelsen. Den sidste cachelagrede værdi (15) skrives til systemtabellerne på disken. Når alle 15 numre bruges, vil den næste anmodning (for nummer 16) medføre, at cachen tildeles igen. Den nye sidst cachelagrede værdi (30) skrives til systemtabellerne.

Hvis databasemotoren stoppes, efter at du har brugt 22 numre, skrives det næste tilsigtede sekvensnummer i hukommelsen (23) til systemtabellerne og erstatter det tidligere gemte nummer.når serveren er genstartet, og der er behov for et sekvensnummer, læses startnummeret fra systemtabellerne (23). Cachemængden på 15 numre (23-38) tildeles hukommelsen, og det næste ikke-cache-nummer (39) skrives til systemtabellerne.

hvis databasemotoren stopper unormalt for en hændelse som f.eks. strømsvigt, genstarter sekvensen med nummeret læst fra systemtabeller (39). Alle sekvensnumre, der er tildelt hukommelsen (men aldrig anmodet om af en bruger eller et program), går tabt. Denne funktionalitet kan efterlade huller, men garanterer, at den samme værdi aldrig udstedes to gange for et enkelt sekvensobjekt, medmindre det er defineret som cyklus eller genstartes manuelt.

cachen opretholdes i hukommelsen ved at spore den aktuelle værdi (den sidst udstedte værdi) og antallet af værdier, der er tilbage i cachen. Derfor er mængden af hukommelse, der bruges af cachen, altid to forekomster af datatypen for sekvensobjektet.

Indstilling af cache-argumentet til ingen CACHE skriver den aktuelle sekvensværdi til systemtabellerne, hver gang en sekvens bruges. Dette kan sænke ydeevnen ved at øge diskadgangen, men reducerer risikoen for utilsigtede huller. Huller kan stadig opstå, hvis der anmodes om tal ved hjælp af den næste værdi for eller sp_sekvens_get_range-funktioner, men derefter bruges tallene enten ikke eller bruges i ikke-forpligtede transaktioner.

når et sekvensobjekt bruger indstillingen CACHE, hvis du genstarter sekvensobjektet eller ændrer egenskaberne tilvækst, cyklus, MINVÆRDI, MAKSVÆRDI eller cache-størrelse, vil det medføre, at cachen skrives til systemtabellerne, før ændringen sker. Derefter genindlæses cachen startende med den aktuelle værdi (dvs.ingen tal springes over). Ændring af cachestørrelsen træder i kraft med det samme.

CACHE-indstilling når cachede værdier er tilgængelige

følgende proces finder sted, hver gang et sekvensobjekt anmodes om at generere den næste værdi for CACHE-indstillingen, hvis der er ubrugte værdier tilgængelige i cachen i hukommelsen for sekvensobjektet.

  1. den næste værdi for sekvensobjektet beregnes.

  2. den nye aktuelle værdi for sekvensobjektet opdateres i hukommelsen.

  3. den beregnede værdi returneres til opkaldsopgørelsen.

CACHE indstilling når cachen er opbrugt

følgende proces finder sted, hver gang et sekvensobjekt anmodes om at generere den næste værdi for CACHE-indstillingen, hvis cachen er opbrugt:

  1. den næste værdi for sekvensobjektet beregnes.

  2. den sidste værdi for den nye cache beregnes.

  3. rækken systemtabel for sekvensobjektet er låst, og værdien beregnet i trin 2 (den sidste værdi) skrives til systemtabellen. En cache-udtømt begivenhed fyres for at underrette brugeren om den nye vedvarende værdi.

ingen CACHE-indstilling

følgende proces finder sted, hver gang et sekvensobjekt anmodes om at generere den næste værdi for indstillingen Ingen CACHE:

  1. den næste værdi for sekvensobjektet beregnes.

  2. den nye aktuelle værdi for sekvensobjektet skrives til systemtabellen.

  3. den beregnede værdi returneres til opkaldsopgørelsen.

Metadata

for information om sekvenser, forespørgsel sys.sekvens.

sikkerhed

tilladelser

kræver oprettelse af sekvens, ændring eller KONTROLTILLADELSE på skemaet.

  • medlemmer af db_ejer og db_ddladmin faste databaseroller kan oprette, ændre og slippe sekvensobjekter.

  • medlemmer af db_ejeren og db_dataskriveren faste databaseroller kan opdatere sekvensobjekter ved at få dem til at generere tal.

følgende eksempel giver brugeren tilladelse til at oprette sekvenser i Testskemaet.

GRANT CREATE SEQUENCE ON SCHEMA::Test TO 

ejerskab af et sekvensobjekt kan overføres ved hjælp af ALTER AUTORISATIONSERKLÆRINGEN.

hvis en sekvens bruger en brugerdefineret datatype, skal skaberen af sekvensen have referencer tilladelse på typen.

revision

for at revidere Opret sekvens skal du overvåge SCHEMA_OBJECT_CHANGE_GROUP.

eksempler

for eksempler på oprettelse af sekvenser og brug af den næste værdi for funktion til at generere sekvensnumre, se sekvensnumre.

de fleste af følgende eksempler opretter sekvensobjekter i et skema med navnet Test.

udfør følgende sætning for at oprette Testskemaet.

CREATE SCHEMA Test ; GO 

A. oprettelse af en sekvens, der stiger med 1

i det følgende eksempel opretter Thierry en sekvens med navnet CountBy1, der øges med en hver gang den bruges.

CREATE SEQUENCE Test.CountBy1 START WITH 1 INCREMENT BY 1 ; GO 

B. oprettelse af en sekvens, der falder med 1

følgende eksempel starter ved 0 og tæller i negative tal med en hver gang den bruges.

CREATE SEQUENCE Test.CountByNeg1 START WITH 0 INCREMENT BY -1 ; GO 

C. Oprettelse af en sekvens, der øges med 5

følgende eksempel opretter en sekvens, der øges med 5, hver gang den bruges.

CREATE SEQUENCE Test.CountBy1 START WITH 5 INCREMENT BY 5 ; GO 

D. oprettelse af en sekvens, der starter med et udpeget nummer

efter import af en tabel bemærker Thierry, at det højeste anvendte ID-nummer er 24.328. Thierry har brug for en sekvens, der genererer tal, der starter ved 24.329. Følgende kode opretter en sekvens, der starter med 24.329 og trin med 1.

CREATE SEQUENCE Test.ID_Seq START WITH 24329 INCREMENT BY 1 ; GO 

E. Oprettelse af en sekvens ved hjælp af standardværdier

følgende eksempel opretter en sekvens ved hjælp af standardværdierne.

CREATE SEQUENCE Test.TestSequence ; 

Udfør følgende sætning for at se sekvensens egenskaber.

SELECT * FROM sys.sequences WHERE name = 'TestSequence' ; 

en delvis liste over output viser standardværdierne.

Output Default value
start_value -9223372036854775808
increment 1
mimimum_value -9223372036854775808
maximum_value 9223372036854775807
is_cycling 0
is_cached 1
current_value -9223372036854775808

F. oprettelse af en sekvens med en bestemt datatype

følgende eksempel opretter en sekvens ved hjælp af smallint-datatypen med et interval fra -32.768 til 32.767.

CREATE SEQUENCE SmallSeq AS smallint ; 

G. oprettelse af en sekvens ved hjælp af alle argumenter

følgende eksempel opretter en sekvens med navnet Decseks ved hjælp af decimaldatatypen med et interval fra 0 til 255. Sekvensen starter med 125 og øges med 25 hver gang et tal genereres. Da sekvensen er konfigureret til at cykle, når værdien overstiger den maksimale værdi på 200, genstarter sekvensen med minimumsværdien på 100.

CREATE SEQUENCE Test.DecSeq AS decimal(3,0) START WITH 125 INCREMENT BY 25 MINVALUE 100 MAXVALUE 200 CYCLE CACHE 3 ; 

Udfør følgende sætning for at se den første værdi; START WITH mulighed for 125.

SELECT NEXT VALUE FOR Test.DecSeq; 

Udfør sætningen tre gange for at returnere 150, 175 og 200.

Udfør sætningen igen for at se, hvordan startværdien cykler tilbage til MINVALUE mulighed for 100.

Udfør følgende kode for at bekræfte cachestørrelsen og se den aktuelle værdi.

SELECT cache_size, current_value FROM sys.sequences WHERE name = 'DecSeq' ; 

Se også

ALTER sekvens (Transact-kvm)
DROP sekvens (Transact-kvm)
næste værdi for (Transact-kvm)
sekvensnumre

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.