Bemærk
Adgang til denne side kræver godkendelse. Du kan prøve at logge på eller ændre mapper.
Adgang til denne side kræver godkendelse. Du kan prøve at ændre mapper.
Gælder for:✅ Warehouse i Microsoft Fabric
I Fabric data warehouse genererer kolonner automatisk nye numeriske værdier, IDENTITY når du indsætter nye rækker i en tabel.
Surrogatnøgler er identifikatorer, der bruges i datalager til unikt at skelne rækker, uafhængigt af deres naturlige nøgler. Denne artikel forklarer, hvordan man opretter og administrerer surrogatnøgler ved hjælp af IDENTITY, herunder indsættelse af eksplicitte værdier og genseedning.
Hvorfor bruge en IDENTITET-kolonne?
IDENTITY Kolonner eliminerer manuel nøglefordeling, hvilket reducerer risikoen for fejl og forenkler dataindlæsning. Systemadministrerede unikke værdier er ideelle som surrogatnøgler og primærnøgler. Sammenlignet med manuelle tilgange tilbyder kolonner bedre ydeevne, IDENTITY fordi unikke nøgler genereres automatisk uden ekstra forespørgselslogik.
Bigott-datatypen, som kræves for IDENTITY kolonner, kan gemme op til 9.223.372.036.854.775.807 positive heltalsværdier. Dette interval sikrer, at hver række modtager en unik værdi i sin IDENTITY kolonne gennem hele tabellens levetid.
For en plan om at migrere data med surrogatnøgler fra andre databaseplatforme, se Migrate IDENTITY-kolonner til Fabric data warehouse.
Syntaks
For at definere en IDENTITY kolonne i Fabric data warehouse, brug egenskaben IDENTITY i kolonnedefinitionen:
CREATE TABLE { warehouse_name.schema_name.table_name | schema_name.table_name | table_name } (
[ column_name ] BIGINT IDENTITY ,
[ ,...n ]
-- Other columns here
);
Identitetskolonnen behøver ikke at være den første kolonne i tabeldefinitionen.
Hvordan IDENTITY-kolonner fungerer
I Fabric data warehouse kan du ikke angive en brugerdefineret startværdi eller inkrement. Systemet håndterer værdier internt for at sikre unikhed.
IDENTITY kolonner producerer altid positive heltalsværdier. Hver ny række modtager en ny værdi, og entydighed er garanteret, så længe tabellen eksisterer. Når en værdi er brugt, IDENTITY bruges den samme værdi ikke igen. Der kan opstå huller i de værdier, som kolonnen IDENTITY producerer.
Fordeling af værdier
På grund af warehouse-motorens distribuerede arkitektur garanterer egenskaben IDENTITY ikke rækkefølgen, hvori surrogatværdier allokeres. Egenskaben skaleres ud på tværs af beregningsnoder for at maksimere parallelisme uden at påvirke belastningsydelsen. Som følge heraf er værdiintervaller fra forskellige indtagelsesopgaver måske ikke sekventielle.
Følgende eksempel illustrerer denne adfærd:
-- Create a table with an IDENTITY column
CREATE TABLE dbo.Table1(
Column1 BIGINT IDENTITY,
Column2 VARCHAR(30) NULL
)
-- Ingestion task A
INSERT INTO dbo.Table1
VALUES (NULL), (NULL), (NULL), (NULL);
-- Ingestion task B
INSERT INTO dbo.Table1
VALUES (NULL), (NULL), (NULL), (NULL);
-- Review the data
SELECT * FROM dbo.Table1;
Eksempelresultat:
I dette eksempel og Ingestion task AIngestion task B køre sekventielt som uafhængige opgaver. Selvom opgaverne kører i træk, har den første og sidste fire række forskellige identitetsnøgleintervaller i dbo.Table1.Column1. Der kan også opstå huller mellem de områder, der er tildelt opgave A og opgave B.
IDENTITYi Fabric data warehouse garanterer, at alle værdier i en IDENTITY kolonne er unikke, så længe der IDENTITY_INSERT ikke bruges, men der kan opstå huller i de intervaller, der produceres til en indlæsningsopgave.
Systemmetadataobjekter
Følgende systemmetadata-objekter er tilgængelige og nyttige ved design og arbejde med identitetsværdier i Fabric data warehouse.
List identitetskolonner med sys.identity_columns systemvisning
Brug sys.identity_columns katalogvisning til at liste alle identitetskolonner i et lager. Følgende eksempel viser alle tabeller, der indeholder en IDENTITY kolonne, inklusive skema-, tabell- og identitetskolonnenavne:
SELECT
s.name AS SchemaName,
t.name AS TableName,
c.name AS IdentityColumnName
FROM
sys.identity_columns AS ic
INNER JOIN
sys.columns AS c ON ic.[object_id] = c.[object_id]
AND ic.column_id = c.column_id
INNER JOIN
sys.tables AS t ON ic.[object_id] = t.[object_id]
INNER JOIN
sys.schemas AS s ON t.[schema_id] = s.[schema_id]
ORDER BY
s.name, t.name;
I Fabric data warehouse seed_value bliver og increment_value og kolonnerne sys.identity_columns returneret NULL og ikke opdateret efter identitetskolonnen oprettes. Kolonnen last_value returnerer NULL som standard, men skifter permanent til -1 efter den første identitetsindsættelsesoperation i tabellen.
Indsæt værdier med IDENTITY_INSERT
Som standard kan du ikke indsætte værdier i en IDENTITY kolonne. Du kan dog være nødt til at indsætte specifikke værdier under datamigration, katastrofegendannelse eller når du udfylder sentinel-værdier, for eksempel -1 for "Ukendt" i dimensionstabeller.
Brug SET IDENTITY_INSERT til midlertidigt at tillade eksplicitte indsættelser i en identitetskolonne:
SET IDENTITY_INSERT dbo.DimCustomer ON;
INSERT INTO dbo.DimCustomer (CustomerKey, CustomerName, Email)
VALUES (-1, 'John Doe', 'john@contoso.com');
SET IDENTITY_INSERT dbo.DimCustomer OFF;
Når IDENTITY_INSERT er ON:
- En kolonneliste er nødvendig med udsagnet
INSERT. - Kun én tabel pr. session kan være
IDENTITY_INSERTsat til adONgangen.
Vigtigt!
Efter slukning IDENTITY_INSERTskal identitetsværdier sets tilbage med DBCC CHECKIDENT.
Genfrø identitetsværdier med DBCC CHECKIDENT
Efter du har indsat eksplicitte værdier med IDENTITY_INSERT, brug DBCC CHECKIDENT til at genindsætte identitetskolonnen. Operationen RESEED scanner alle brugte og reserverede identitetsintervaller på tværs af distribuerede beregningsnoder for at bestemme de korrekte næste værdier, sikre entykhed og forhindre nøglekollisioner.
DBCC CHECKIDENT('dbo.DimProduct', RESEED);
I Fabric data warehouse DBCC CHECKIDENT understøtter kun mulighedenRESEED. Lageret bestemmer automatisk de korrekte næste værdiintervaller, og du kan ikke specificere en brugerdefineret så-værdi. For mere information, se DBCC CHECKIDENT.
Limitations
For mere information, se IDENTITY-kolonner, IDENTITY (Transact-SQL) og Opret tabeller i Warehouse i Microsoft Fabric.
- Kun bigint-datatypen understøttes for
IDENTITYkolonner i Fabric data warehouse. Andre datatyper resulterer i en fejl. - At definere et seed og en inkrementrate understøttes ikke. Systemet styrer værdier internt.
- At tilføje en
IDENTITYkolonne til en eksisterende tabel med understøttesALTER TABLEikke. Overvej at bruge CREATE TABLE AS SELECT (CTAS) eller SELECT... INTO for at oprette en kopi af en eksisterende tabel og tilføje enIDENTITYkolonne. - Begrænsninger gælder, hvordan
IDENTITYkolonner bevares, når du opretter en tabel ved at vælge fra en anden tabel med CTAS ellerSELECT...INTO. For mere information, se afsnittet om datatyper i SELECT - INTO Clause (Transact-SQL). -
DBCC CHECKIDENTunderstøtter kun mulighedenRESEED. At angive en brugerdefineret seed-værdi eller brugeNORESEEDdet understøttes ikke. -
IDENTITYKolonner giver værdier, der er garanteret unikke, men værdierne er ikke nødvendigvis sekventielle eller ordnede, og der kan opstå gaps.
Eksempler
A. Opret en tabel med en IDENTITY-kolonne
CREATE TABLE Employees (
EmployeeID BIGINT IDENTITY,
FirstName VARCHAR(50),
LastName VARCHAR(50)
);
Denne sætning opretter en Employees tabel, hvor hver ny række automatisk modtager en unik EmployeeID værdi som bigint .
B. Indsæt rækker i en tabel med en identitetskolonne
Når du angiver værdier for hver ikke-identitetskolonne i deres definerede rækkefølge, behøver du ikke specificere en kolonneliste:
INSERT INTO Employees VALUES ('Quarantino', 'Esposito');
Du kan også give en kolonneliste, der udelader identitetskolonnen:
INSERT INTO Employees (FirstName, LastName)
VALUES ('Ensi', 'Vasala');
C. Indsæt eksplicitte værdier med IDENTITY_INSERT
SET IDENTITY_INSERT dbo.Employees ON;
INSERT INTO dbo.Employees (EmployeeID, FirstName, LastName)
VALUES (100, 'Sentinel', 'Row');
SET IDENTITY_INSERT dbo.Employees OFF;
D. Indsæt eksplicitte værdier med COPY INTO
Sætningen COPY INTO understøtter muligheden IDENTITY_INSERT for at indlæse eksplicitte værdier i kommandoen.
COPY INTO Muligheder tilsidesætter enhver sessions-niveau indstilling for IDENTITY_INSERT.
COPY INTO dbo.Employees (EmployeeID 1, FirstName 2, LastName 3)
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/'
WITH (
FILE_TYPE = 'CSV',
IDENTITY_INSERT = 'ON'
);
E. Genseedning af en tabel efter eksplicitte indsættelser
DBCC CHECKIDENT('dbo.Employees', RESEED);
F. Opret en tabel med CREATE TABLE AS SELECT
Brug CTAS til at oprette en kopi af en tabel og bevare egenskaben IDENTITY i måltabellen:
CREATE TABLE RetiredEmployees
AS SELECT * FROM Employees;
Kolonnen i måltabellen arver egenskaben IDENTITY fra kildetabellen. For begrænsninger, se afsnittet om datatyper i SELECT - INTO Clause.
G. Opret en tabel med SELECT... IND
Brug SELECT...INTO til at oprette en kopi af en tabel og bevare egenskaben IDENTITY i måltabelen:
SELECT *
INTO dbo.RetiredEmployees
FROM dbo.Employees
WHERE LastName = 'Esposito';
Kolonnen i måltabellen arver egenskaben IDENTITY fra kildetabellen. For begrænsninger, se afsnittet om datatyper i SELECT - INTO Clause.