ย้ายคอลัมน์ IDENTITY ไปยัง Fabric คลังข้อมูล

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

บทความนี้อธิบายวิธีใช้ SET IDENTITY_INSERT และ DBCC CHECKIDENT เพื่อรักษาค่าตัวตนที่มีอยู่ระหว่างการย้ายจาก SQL Server, Azure SQL Database หรือ Azure Synapse Analytics และรับประกันความสมบูรณ์ของการอ้างอิง

ความแตกต่างสําคัญจากแพลตฟอร์มอื่น ๆ

ก่อนย้ายข้อมูล โปรดเข้าใจความแตกต่างIDENTITYเหล่านี้ในการใช้งานใน Fabric คลังข้อมูล:

  • IDENTITY คอลัมน์รองรับเฉพาะชนิดข้อมูล Bigint เท่านั้น
  • SEED และ INCREMENT พารามิเตอร์ไม่รองรับ ระบบจัดการค่าภายใน
  • ค่าต่าง ๆ รับประกันว่าจะเป็นเอกลักษณ์ แต่ไม่จําเป็นต้องเรียงลําดับเสมอไป ช่องว่างอาจเกิดขึ้นได้เนื่องจากสถาปัตยกรรมการประมวลผลแบบกระจาย
  • Fabric คลังข้อมูล ไม่ได้บังคับใช้ข้อจํากัดที่สําคัญ

กลยุทธ์การโยกย้าย

โดยใช้ IDENTITY_INSERT support คุณสามารถย้ายค่าตัวตนไปยังตาราง IDENTITY Fabric คลังข้อมูล ที่ใช้คอลัมน์ได้โดยตรง:

  1. สร้างตารางปลายทางในรูปแบบ Fabric คลังข้อมูล พร้อมIDENTITYคอลัมน์
  2. ใช้เพื่อ SET IDENTITY_INSERT ON แทรกข้อมูลย้อนหลังโดยยังคงค่าตัวตนเดิมไว้
  3. เรียกใช้ DBCC CHECKIDENT กับ RESEED เพื่อปรับแนวช่วงข้อมูลตัวตนหลังจากการย้ายข้อมูล
  4. อัปเดตการอ้างอิงคีย์ต่างประเทศหากจําเป็น

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

ตัวอย่าง: ย้ายตารางที่มีคอลัมน์ IDENTITY

ตัวอย่างต่อไปนี้ย้ายOrdersตารางจากแพลตฟอร์มต้นทางไปยัง Fabric คลังข้อมูล โดยยังคงรักษาค่าตัวตนไว้

ขั้นตอนที่ 1: สร้างตารางปลายทางที่มีคอลัมน์ IDENTITY

สร้างตารางปลายทางใน Fabric คลังข้อมูล คอลัมน์คีย์หลักใช้ IDENTITY:

CREATE TABLE dbo.Orders (
    OrderID BIGINT IDENTITY,
    OrderDate DATE,
    CustomerID BIGINT,
    TotalAmount DECIMAL(18, 2)
);

ขั้นตอนที่ 2: ย้ายข้อมูลด้วย IDENTITY_INSERT

ใช้เพื่อ SET IDENTITY_INSERT แทรกข้อมูลย้อนหลังที่มีค่าตัวตนเดิม วิธีนี้จะรักษา ID ที่มีอยู่ไว้ เพื่อให้ความสัมพันธ์ระหว่างตารางยังคงอยู่

-- Migrate Orders with original IDs
SET IDENTITY_INSERT dbo.Orders ON;

INSERT INTO dbo.Orders (OrderID, OrderDate, CustomerID, TotalAmount)
VALUES (101, '2025-01-15', 1, 5000.00),
       (102, '2025-02-20', 2, 3200.00),
       (103, '2025-03-10', 1, 7800.00),
       (104, '2025-04-05', 3, 1500.00);

SET IDENTITY_INSERT dbo.Orders OFF;

สําหรับชุดข้อมูลขนาดใหญ่ คุณสามารถใช้ COPY INTO ร่วมกับ IDENTITY_INSERT:

COPY INTO dbo.Orders (OrderID 1, OrderDate 2, CustomerID 3, TotalAmount 4)
FROM 'https://storage.blob.core.windows.net/migration/orders.csv'
WITH (
    FILE_TYPE = 'CSV',
    IDENTITY_INSERT = 'ON'
);

ขั้นตอนที่ 3: เพิ่มการตั้งชื่อคอลัมน์ระบุตัวตนใหม่

หลังจากย้ายข้อมูลแล้ว ให้รัน DBCC CHECKIDENT กับ บน RESEED แต่ละตาราง การดําเนินการนี้จะสแกนช่วงข้อมูลประจําตัวที่ใช้ทั้งหมดและปรับค่าถัดไปเพื่อหลีกเลี่ยงการชนกับข้อมูลที่ถูกย้าย:

DBCC CHECKIDENT('dbo.Orders', RESEED);

ขั้นตอนที่ 4: ตรวจสอบการย้ายข้อมูลและทดสอบการแทรกใหม่

ยืนยันว่าข้อมูลที่ย้ายมายังคงสมบูรณ์และไฟล์แทรกใหม่จะได้รับค่าที่สร้างขึ้นโดยอัตโนมัติโดยไม่ทับซ้อนกับค่าที่ย้าย:

-- Verify migrated data
SELECT * FROM dbo.Orders ORDER BY OrderID;

-- Insert a row that receives an automatically generated ID
INSERT INTO dbo.Orders (OrderDate, CustomerID, TotalAmount)
VALUES ('2025-05-01', 1, 2500.00);

-- Verify that new IDs don't overlap with migrated data
SELECT * FROM dbo.Orders ORDER BY OrderID;

แนวทางปฏิบัติที่ดีที่สุด

  • ควรหว่านเมล็ดใหม่หลังการย้ายทุกครั้ง รัน DBCC CHECKIDENT('table_name', RESEED) หลังจากการย้ายตารางทุกครั้งเพื่อป้องกันการชนกันของค่าตัวตน
  • ใช้ COPY INTO สําหรับชุดข้อมูลขนาดใหญ่ สําหรับการย้ายตารางCOPY INTOขนาดใหญ่จํานวนมาก จะIDENTITY_INSERT ONให้ประสิทธิภาพที่ดีกว่าคําสั่งแบบแถวต่อแถวINSERT
  • ตรวจสอบความถูกต้องของการอ้างอิง หลังจากการย้ายข้อมูล ให้ตรวจสอบว่าค่าคีย์ต่างประเทศในตารางลูกอ้างอิงถึงแถวที่ถูกต้องในตารางแม่