สร้างตัวระบุที่ไม่ซ้ํากันในตารางคลังสินค้าใน Microsoft Fabric
นําไปใช้กับ:✅ Warehouse ใน Microsoft Fabric
เป็นข้อกําหนดทั่วไปในคลังข้อมูลเพื่อกําหนดตัวระบุที่ไม่ซ้ํากันสําหรับแต่ละแถวของตาราง ในสภาพแวดล้อมที่ใช้ SQL Server โดยทั่วไปแล้วจะทําโดยการสร้าง คอลัมน์ ข้อมูลประจําตัวในตาราง อย่างไรก็ตามคุณลักษณะนี้ไม่ได้รับการสนับสนุนในคลังสินค้าใน Microsoft Fabric แต่คุณจําเป็นต้องใช้เทคนิคการแก้ปัญหาชั่วคราวแทน เรานําเสนอสองทางเลือก
บทความนี้อธิบายเทคนิคการแก้ปัญหาชั่วคราวเพื่อสร้างตัวระบุที่ไม่ซ้ํากันในตารางคลังสินค้า
วิธีที่ 1
วิธีนี้ใช้ได้มากที่สุดเมื่อคุณต้องการสร้างค่าข้อมูลประจําตัว แต่ลําดับของค่าไม่ใช่เรื่องสําคัญ (ยอมรับค่าที่ไม่เรียงกันได้)
ค่าที่ไม่ซ้ํากันจะถูกสร้างขึ้นในรหัสที่แทรกข้อมูลลงในตาราง
หากต้องการสร้างข้อมูลที่ไม่ซ้ํากันโดยใช้วิธีนี้ ให้สร้างตารางที่มีคอลัมน์ที่จัดเก็บค่าตัวระบุที่ไม่ซ้ํากัน ชนิดข้อมูลของคอลัมน์ควรได้รับการตั้งค่าเป็น bigint นอกจากนี้ คุณควรกําหนดคอลัมน์เป็น
NOT NULL
เพื่อให้แน่ใจว่าทุกแถวได้รับการกําหนดตัวระบุตัวอย่างรหัส T-SQL ต่อไปนี้จะสร้างตารางตัวอย่างที่มี
Orders_with_Identifier
ชื่อในdbo
schema ซึ่งRow_ID
คอลัมน์ทําหน้าที่เป็นคีย์ที่ไม่ซ้ํากัน--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 );
เมื่อคุณแทรกแถวลงในตาราง ผ่านสคริปต์ T-SQL หรือรหัสแอปพลิเคชัน หรือสร้างข้อมูลเฉพาะสําหรับ
Row_ID
ด้วยNEWID()
ฟังก์ชัน ฟังก์ชันนี้สร้างค่าที่ไม่ซ้ํากันของตัวระบุที่ไม่ซ้ํากันประเภทซึ่งสามารถแปลงและจัดเก็บเป็น bigint ได้รหัสต่อไปนี้แทรกแถวลงใน
dbo.Orders_with_Identifier
ตาราง ค่าสําหรับRow_ID
คอลัมน์จะถูกคํานวณโดยการแปลงค่าที่แสดงโดยnewid()
ฟังก์ชัน ฟังก์ชันไม่จําเป็นต้องมีORDER BY
ส่วนคําสั่งและสร้างค่าใหม่สําหรับแต่ละระเบียน--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];
วิธีที่ 2
วิธีนี้ใช้ได้มากที่สุดเมื่อคุณจําเป็นต้องสร้างค่าข้อมูลประจําตัวตามลําดับ แต่ควรใช้ด้วยความระมัดระวังกับชุดข้อมูลขนาดใหญ่ เนื่องจากอาจช้ากว่าวิธีการทางเลือกอื่น ควรทําการพิจารณาสําหรับกระบวนการหลายกระบวนการที่แทรกข้อมูลพร้อมกันเนื่องจากอาจทําให้เกิดค่าที่ซ้ํากัน
หากต้องการสร้างข้อมูลที่ไม่ซ้ํากันโดยใช้วิธีนี้ ให้สร้างตารางที่มีคอลัมน์ที่จัดเก็บค่าตัวระบุที่ไม่ซ้ํากัน ชนิดข้อมูลของคอลัมน์ควรได้รับการตั้งค่าเป็น int หรือ bigint โดยขึ้นอยู่กับปริมาณของข้อมูลที่คุณคาดว่าจะจัดเก็บ นอกจากนี้ คุณควรกําหนดคอลัมน์เป็น
NOT NULL
เพื่อให้แน่ใจว่าทุกแถวได้รับการกําหนดตัวระบุตัวอย่างรหัส T-SQL ต่อไปนี้จะสร้างตารางตัวอย่างที่มี
Orders_with_Identifier
ชื่อในdbo
schema ซึ่งRow_ID
คอลัมน์ทําหน้าที่เป็นคีย์ที่ไม่ซ้ํากัน--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
ก่อนที่คุณจะแทรกแถวลงในตาราง คุณจําเป็นต้องกําหนดค่าตัวระบุล่าสุดที่จัดเก็บไว้ในตาราง คุณสามารถทําได้โดยการเรียกข้อมูลค่าตัวระบุสูงสุด ค่านี้ควรกําหนดให้กับตัวแปรเพื่อให้คุณสามารถอ้างอิงได้เมื่อคุณแทรกแถวตาราง (ในขั้นตอนถัดไป)
รหัสต่อไปนี้กําหนดค่าตัวระบุสุดท้ายให้กับตัวแปรชื่อ
@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;
เมื่อคุณแทรกแถวลงในตาราง ตัวเลขที่ไม่ซ้ํากันและลําดับจะถูกคํานวณโดยการเพิ่มค่าของ
@MaxID
ตัวแปรไปยังค่าที่ส่งกลับโดยฟังก์ชัน ROW_NUMBER ฟังก์ชันนี้เป็นฟังก์ชันหน้าต่างที่คํานวณหมายเลขแถวตามลําดับที่เริ่มต้นด้วย1
รหัส T-SQL ต่อไปนี้ –ซึ่งทํางานในชุดงานเดียวกันกับสคริปต์ในขั้นตอนที่ 2 - แทรกแถวลงใน
Orders_with_Identifier
ตาราง ค่าสําหรับRow_ID
คอลัมน์จะถูกคํานวณโดยการเพิ่ม@MaxID
ตัวแปรไปยังค่าที่ROW_NUMBER
ส่งกลับโดยฟังก์ชัน ฟังก์ชันต้องมีORDER BY
คําสั่ง ซึ่งกําหนดลําดับตรรกะของแถวภายในชุดผลลัพธ์ อย่างไรก็ตาม เมื่อตั้งค่าเป็นSELECT NULL
ไม่มีการกําหนดลําดับตรรกะซึ่งหมายความว่าค่าตัวระบุจะถูกกําหนดโดยพลการ ส่วนคําสั่งนี้ORDER BY
ส่งผลให้มีการดําเนินการเร็วขึ้น--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];