แชร์ผ่าน


สร้างตัวระบุที่ไม่ซ้ํากันในตารางคลังสินค้าใน Microsoft Fabric

นําไปใช้กับ:✅ Warehouse ใน Microsoft Fabric

เป็นข้อกําหนดทั่วไปในคลังข้อมูลเพื่อกําหนดตัวระบุที่ไม่ซ้ํากันสําหรับแต่ละแถวของตาราง ในสภาพแวดล้อมที่ใช้ SQL Server โดยทั่วไปแล้วจะทําโดยการสร้าง คอลัมน์ ข้อมูลประจําตัวในตาราง อย่างไรก็ตามคุณลักษณะนี้ไม่ได้รับการสนับสนุนในคลังสินค้าใน Microsoft Fabric แต่คุณจําเป็นต้องใช้เทคนิคการแก้ปัญหาชั่วคราวแทน เรานําเสนอสองทางเลือก

บทความนี้อธิบายเทคนิคการแก้ปัญหาชั่วคราวเพื่อสร้างตัวระบุที่ไม่ซ้ํากันในตารางคลังสินค้า

วิธีที่ 1

วิธีนี้ใช้ได้มากที่สุดเมื่อคุณต้องการสร้างค่าข้อมูลประจําตัว แต่ลําดับของค่าไม่ใช่เรื่องสําคัญ (ยอมรับค่าที่ไม่เรียงกันได้)

ค่าที่ไม่ซ้ํากันจะถูกสร้างขึ้นในรหัสที่แทรกข้อมูลลงในตาราง

  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
    );
    
  2. เมื่อคุณแทรกแถวลงในตาราง ผ่านสคริปต์ 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

วิธีนี้ใช้ได้มากที่สุดเมื่อคุณจําเป็นต้องสร้างค่าข้อมูลประจําตัวตามลําดับ แต่ควรใช้ด้วยความระมัดระวังกับชุดข้อมูลขนาดใหญ่ เนื่องจากอาจช้ากว่าวิธีการทางเลือกอื่น ควรทําการพิจารณาสําหรับกระบวนการหลายกระบวนการที่แทรกข้อมูลพร้อมกันเนื่องจากอาจทําให้เกิดค่าที่ซ้ํากัน

  1. หากต้องการสร้างข้อมูลที่ไม่ซ้ํากันโดยใช้วิธีนี้ ให้สร้างตารางที่มีคอลัมน์ที่จัดเก็บค่าตัวระบุที่ไม่ซ้ํากัน ชนิดข้อมูลของคอลัมน์ควรได้รับการตั้งค่าเป็น 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
    
  2. ก่อนที่คุณจะแทรกแถวลงในตาราง คุณจําเป็นต้องกําหนดค่าตัวระบุล่าสุดที่จัดเก็บไว้ในตาราง คุณสามารถทําได้โดยการเรียกข้อมูลค่าตัวระบุสูงสุด ค่านี้ควรกําหนดให้กับตัวแปรเพื่อให้คุณสามารถอ้างอิงได้เมื่อคุณแทรกแถวตาราง (ในขั้นตอนถัดไป)

    รหัสต่อไปนี้กําหนดค่าตัวระบุสุดท้ายให้กับตัวแปรชื่อ@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;
    
  3. เมื่อคุณแทรกแถวลงในตาราง ตัวเลขที่ไม่ซ้ํากันและลําดับจะถูกคํานวณโดยการเพิ่มค่าของ@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];