Unieke id's genereren in een magazijntabel in Microsoft Fabric
Van toepassing op:✅ Warehouse in Microsoft Fabric
Het is een algemene vereiste in datawarehouses om een unieke id toe te wijzen aan elke rij van een tabel. In sql Server-omgevingen wordt dit meestal gedaan door een identiteitskolom in een tabel te maken, maar op dit moment wordt deze functie niet ondersteund in een magazijn in Microsoft Fabric. In plaats daarvan moet u een tijdelijke oplossingstechniek gebruiken. We presenteren twee alternatieven.
In dit artikel worden tijdelijke oplossingen beschreven voor het genereren van unieke id's in een magazijntabel.
Methode 1
Deze methode is het meest van toepassing wanneer u identiteitswaarden moet maken, maar de volgorde van de waarden is niet belangrijk (niet-opeenvolgende waarden zijn acceptabel).
Unieke waarden worden gegenereerd in de code waarmee gegevens in de tabel worden ingevoegd.
Als u unieke gegevens wilt maken met deze methode, maakt u een tabel met een kolom waarin unieke id-waarden worden opgeslagen. Het gegevenstype van de kolom moet worden ingesteld op bigint. U moet ook de kolom
NOT NULL
definiëren om ervoor te zorgen dat aan elke rij een id wordt toegewezen.In het volgende T-SQL-codevoorbeeld wordt een voorbeeldtabel gemaakt met de naam
Orders_with_Identifier
in hetdbo
schema, waarbij deRow_ID
kolom fungeert als een unieke sleutel.--Drop a table named 'Orders_with_Identifier' in schema 'dbo', if it exists IF OBJECT_ID('[dbo].[Orders_with_Identifier]', 'U') IS NOT NULL DROP TABLE [dbo].[Orders_with_Identifier]; GO CREATE TABLE [dbo].[Orders_with_Identifier] ( [Row_ID] BIGINT NOT NULL, [O_OrderKey] BIGINT NULL, [O_CustomerKey] BIGINT NULL, [O_OrderStatus] VARCHAR(1) NULL, [O_TotalPrice] DECIMAL(15, 2) NULL, [O_OrderDate] DATE NULL, [O_OrderPriority] VARCHAR(15) NULL, [O_Clerk] VARCHAR (15) NULL, [O_ShipPriority] INT NULL, [O_Comment] VARCHAR (79) NULL );
Wanneer u rijen in de tabel invoegt, via T-SQL-scripts of toepassingscode of anderszins, genereert u unieke gegevens voor
Row_ID
deNEWID()
functie. Deze functie genereert een unieke waarde van het type uniqueidentifier die vervolgens als bigint kan worden gecast en opgeslagen.Met de volgende code worden rijen in de
dbo.Orders_with_Identifier
tabel ingevoegd. De waarden voor deRow_ID
kolom worden berekend door de waarden te converteren die door denewid()
functie worden geretourneerd. Voor de functie is geen component vereistORDER BY
en wordt voor elke record een nieuwe waarde gegenereerd.--Insert new rows with unique identifiers INSERT INTO [dbo].[Orders_with_Identifier] SELECT CONVERT(BIGINT, CONVERT(VARBINARY, CONCAT(NEWID(), GETDATE()))) AS [Row_ID], [src].[O_OrderKey], [src].[O_CustomerKey], [src].[O_OrderStatus], [src].[O_TotalPrice], [src].[O_OrderDate], [src].[O_OrderPriority], [src].[O_Clerk], [src].[O_ShipPriority], [src].[O_Comment] FROM [dbo].[Orders] AS [src];
Methode 2
Deze methode is het meest van toepassing wanneer u sequentiële identiteitswaarden moet maken, maar moet voorzichtig worden gebruikt voor grotere gegevenssets, omdat deze langzamer kunnen zijn dan alternatieve methoden. Er moeten ook overwegingen worden gemaakt voor meerdere processen die tegelijkertijd gegevens invoegen, omdat dit kan leiden tot dubbele waarden.
Als u unieke gegevens wilt maken met deze methode, maakt u een tabel met een kolom waarin unieke id-waarden worden opgeslagen. Het gegevenstype van de kolom moet worden ingesteld op int of bigint, afhankelijk van het gegevensvolume dat u verwacht op te slaan. U moet ook de kolom
NOT NULL
definiëren om ervoor te zorgen dat aan elke rij een id wordt toegewezen.In het volgende T-SQL-codevoorbeeld wordt een voorbeeldtabel gemaakt met de naam
Orders_with_Identifier
in hetdbo
schema, waarbij deRow_ID
kolom fungeert als een unieke sleutel.--Drop a table named 'Orders_with_Identifier' in schema 'dbo', if it exists IF OBJECT_ID('[dbo].[Orders_with_Identifier]', 'U') IS NOT NULL DROP TABLE [dbo].[Orders_with_Identifier]; GO CREATE TABLE [dbo].[Orders_with_Identifier] ( [Row_ID] BIGINT NOT NULL, [O_OrderKey] BIGINT NULL, [O_CustomerKey] BIGINT NULL, [O_OrderStatus] VARCHAR(1) NULL, [O_TotalPrice] DECIMAL(15, 2) NULL, [O_OrderDate] DATE NULL, [O_OrderPriority] VARCHAR(15) NULL, [O_Clerk] VARCHAR (15) NULL, [O_ShipPriority] INT NULL, [O_Comment] VARCHAR (79) NULL ); GO
Voordat u rijen in de tabel invoegt, moet u de laatste id-waarde bepalen die in de tabel is opgeslagen. U kunt dit doen door de maximum-id-waarde op te halen. Deze waarde moet worden toegewezen aan een variabele, zodat u ernaar kunt verwijzen wanneer u tabelrijen invoegt (in de volgende stap).
Met de volgende code wordt de laatste id-waarde toegewezen aan een variabele met de naam
@MaxID
.--Assign the last identifier value to a variable --If the table doesn't contain any rows, assign zero to the variable DECLARE @MaxID AS BIGINT; IF EXISTS(SELECT * FROM [dbo].[Orders_with_Identifier]) SET @MaxID = (SELECT MAX([Row_ID]) FROM [dbo].[Orders_with_Identifier]); ELSE SET @MaxID = 0;
Wanneer u rijen invoegt in de tabel, worden unieke en opeenvolgende getallen berekend door de waarde van de
@MaxID
variabele toe te voegen aan de waarden die worden geretourneerd door de functie ROW_NUMBER . Deze functie is een vensterfunctie waarmee een opeenvolgend rijnummer wordt berekend dat begint met1
.De volgende T-SQL-code, die wordt uitgevoerd in dezelfde batch als het script in stap 2, voegt rijen in de
Orders_with_Identifier
tabel in. De waarden voor deRow_ID
kolom worden berekend door de@MaxID
variabele toe te voegen aan waarden die door deROW_NUMBER
functie worden geretourneerd. De functie moet eenORDER BY
component hebben, waarmee de logische volgorde van de rijen in de resultatenset wordt gedefinieerd. Wanneer dit is ingesteld opSELECT NULL
, wordt er echter geen logische volgorde opgelegd, wat betekent dat id-waarden willekeurig worden toegewezen. DezeORDER BY
component resulteert in een snellere uitvoeringstijd.--Insert new rows with unique identifiers INSERT INTO [dbo].[Orders_with_Identifier] SELECT @MaxID + ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS [Row_ID], [src].[O_OrderKey], [src].[O_CustomerKey], [src].[O_OrderStatus], [src].[O_TotalPrice], [src].[O_OrderDate], [src].[O_OrderPriority], [src].[O_Clerk], [src].[O_ShipPriority], [src].[O_Comment] FROM [dbo].[Orders] AS [src];