إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
في هذه المقالة، يمكنك العثور على توصيات وأمثلة لاستخدام الخاصية IDENTITY لإنشاء مفاتيح بديلة على الجداول في تجمع SQL المخصص.
ما هو المفتاح البديل؟
المفتاح البديل في الجدول هو عمود بمعرف فريد لكل صف. لا يتم إنشاء المفتاح من بيانات الجدول. يحب مصممي البيانات إنشاء مفاتيح بديلة على جداولهم عند تصميم نماذج مستودع البيانات. يمكنك استخدام الخاصية IDENTITY لتحقيق هذا الهدف ببساطة وفعالية دون التأثير على أداء التحميل.
إشعار
في Azure Synapse Analytics:
- تزيد قيمة IDENTITY من تلقاء نفسها في كل توزيع ولا تتداخل مع قيم IDENTITY في التوزيعات الأخرى. لا تضمن قيمة IDENTITY في Synapse أن تكون فريدة إذا قام المستخدم بإدراج قيمة مكررة بشكل صريح مع
SET IDENTITY_INSERT ONIDENTITY أو إعادة تحديده. للحصول على تفاصيل، راجع CREATE TABLE (Transact-SQL) IDENTITY (Property). - لا يضمن تحديث عمود التوزيع أن تكون قيمة IDENTITY فريدة. استخدم DBCC CHECKIDENT (Transact-SQL) بعد UPDATE على عمود التوزيع للتحقق من التفرد.
إنشاء جدول بعمود IDENTITY
IDENTITY تم تصميم الخاصية لتوسيع نطاقها عبر جميع التوزيعات في تجمع SQL المخصص دون التأثير على أداء التحميل. ولذلك، فإن تنفيذها IDENTITY موجه نحو تحقيق هذه الأهداف.
يمكنك تعريف جدول على أنه يحتوي على الخاصية IDENTITY عند إنشاء الجدول لأول مرة باستخدام بناء جملة مشابه لعبارة التالية:
CREATE TABLE dbo.T1
( C1 INT IDENTITY(1,1) NOT NULL,
C2 INT NULL
)
WITH
( DISTRIBUTION = HASH(C2),
CLUSTERED COLUMNSTORE INDEX
);
يمكنك بعد ذلك استخدام INSERT..SELECT لملء الجدول.
يسلط الجزء المتبقي من هذا القسم الضوء على الفروق الدقيقة في التنفيذ لمساعدتك على فهمها بشكل أكثر اكتمالا.
تخصيص القيم
IDENTITY لا تضمن الخاصية الترتيب الذي يتم به تخصيص القيم البديلة بسبب البنية الموزعة لمستودع البيانات.
IDENTITY تم تصميم الخاصية لتوسيع نطاقها عبر جميع التوزيعات في تجمع SQL المخصص دون التأثير على أداء التحميل.
المثال التالي توضيح:
CREATE TABLE dbo.T1
( C1 INT IDENTITY(1,1) NOT NULL,
C2 VARCHAR(30) NULL
)
WITH
( DISTRIBUTION = HASH(C2),
CLUSTERED COLUMNSTORE INDEX
);
INSERT INTO dbo.T1
VALUES (NULL);
INSERT INTO dbo.T1
VALUES (NULL);
SELECT *
FROM dbo.T1;
DBCC PDW_SHOWSPACEUSED('dbo.T1');
في المثال السابق، هبط صفان في التوزيع 1. يحتوي الصف الأول على القيمة البديلة 1 في العمود C1، بينما يحتوي الصف الثاني على القيمة البديلة 61. تم إنشاء كلتا القيمتين بواسطة الخاصية IDENTITY . ومع ذلك، فإن تخصيص القيم غير متقارب. فهذا السلوك حسب التصميم.
بيانات منحرفة
يتم توزيع نطاق القيم لنوع البيانات بالتساوي عبر التوزيعات. إذا كان الجدول الموزَّع يعاني من بيانات منحرفة، فيمكن استنفاد نطاق القيم المتاحة لنوع البيانات قبل الأوان. على سبيل المثال، إذا انتهى الأمر بجميع البيانات في توزيع واحد، فعندئذٍ يكون للجدول حق الوصول إلى واحد على ستين فقط من قيم نوع البيانات. لهذا السبب، تقتصر الخاصية IDENTITY على INTBIGINT وأنواع البيانات فقط.
SELECT..INTO
عند تحديد عمود موجود IDENTITY في جدول جديد، يرث العمود الجديد الخاصية IDENTITY ، ما لم يكن أحد الشروط التالية صحيحا:
-
SELECTتحتوي العبارة على صلة. - يتم ربط عبارات متعددة
SELECTباستخدامUNION. - يتم
IDENTITYسرد العمود أكثر من مرة واحدة فيSELECTالقائمة. -
IDENTITYالعمود هو جزء من تعبير.
إذا كان أي من هذه الشروط صحيحا، يتم إنشاء NOT NULL العمود بدلا من وراثة الخاصية IDENTITY .
CREATE TABLE AS SELECT
CREATE TABLE AS SELECT يتبع (CTAS) نفس سلوك SQL Server الموثق ل SELECT..INTO. ومع ذلك، لا يمكنك تحديد خاصية IDENTITY في تعريف العمود لجزء CREATE TABLE العبارة. لا يمكنك أيضا استخدام الدالة IDENTITY في SELECT جزء CTAS. لتعبئة جدول، تحتاج إلى استخدام CREATE TABLE لتعريف الجدول متبوعاً بـ INSERT..SELECT لتعبئته.
إدراج قيم صريحة في عمود IDENTITY
يدعم تجمع SQL المخصص بناء الجملة SET IDENTITY_INSERT <your table> ON|OFF. يمكنك استخدام بناء الجملة هذا لإدراج القيم بشكل صريح في IDENTITY العمود.
يحب العديد من مصممي البيانات استخدام القيم السالبة المحددة مسبقاً لصفوف معينة في أبعادها. مثال على ذلك هو صف -1 أو عضو غير معروف.
يوضح البرنامج النصي التالي كيفية إضافة هذا الصف بشكل صريح باستخدام SET IDENTITY_INSERT:
SET IDENTITY_INSERT dbo.T1 ON;
INSERT INTO dbo.T1
( C1,
C2
)
VALUES (-1,'UNKNOWN');
SET IDENTITY_INSERT dbo.T1 OFF;
SELECT *
FROM dbo.T1;
بيانات التحميل
وجود الخاصية IDENTITY له بعض الآثار على التعليمات البرمجية لتحميل البيانات. يسلط هذا القسم الضوء على بعض الأنماط الأساسية لتحميل البيانات في الجداول باستخدام IDENTITY.
لتحميل البيانات في جدول وإنشاء مفتاح بديل باستخدام IDENTITY، قم بإنشاء الجدول ثم استخدم INSERT..SELECT أو INSERT..VALUES لتنفيذ التحميل.
يبرز المثال التالي النمط الأساسي:
--CREATE TABLE with IDENTITY
CREATE TABLE dbo.T1
( C1 INT IDENTITY(1,1),
C2 VARCHAR(30)
)
WITH
( DISTRIBUTION = HASH(C2),
CLUSTERED COLUMNSTORE INDEX
);
--Use INSERT..SELECT to populate the table from an external table
INSERT INTO dbo.T1
(C2)
SELECT C2
FROM ext.T1;
SELECT *
FROM dbo.T1;
DBCC PDW_SHOWSPACEUSED('dbo.T1');
إشعار
لا يمكن استخدام CREATE TABLE AS SELECT حاليا عند تحميل البيانات في جدول مع IDENTITY عمود.
لمزيد من المعلومات حول تحميل البيانات، راجع تصميم الاستخراج والتحميل والتحويل (ELT) لتجمع SQL المخصص وتحميل أفضل الممارسات.
طرق عرض النظام
يمكنك استخدام طريقة عرض كتالوج sys.identity_columns لتعريف عمود يحتوي على الخاصية IDENTITY .
لمساعدتك على فهم مخطط قاعدة البيانات بشكل أفضل، يوضح هذا المثال كيفية التكامل sys.identity_columns مع طرق عرض كتالوج النظام الأخرى:
SELECT sm.name
, tb.name
, co.name
, CASE WHEN ic.column_id IS NOT NULL
THEN 1
ELSE 0
END AS is_identity
FROM sys.schemas AS sm
JOIN sys.tables AS tb ON sm.schema_id = tb.schema_id
JOIN sys.columns AS co ON tb.object_id = co.object_id
LEFT JOIN sys.identity_columns AS ic ON co.object_id = ic.object_id
AND co.column_id = ic.column_id
WHERE sm.name = 'dbo'
AND tb.name = 'T1'
;
القيود
IDENTITY لا يمكن استخدام الخاصية:
- عندما لا
INTيكون نوع بيانات العمود أوBIGINT - عندما يكون العمود هو أيضاً مفتاح التوزيع
- عندما يكون الجدول جدولاً خارجياً
الوظائف التالية ذات الصلة غير مدعومة في تجمع SQL المخصص:
المهام المشتركة
يمكنك استخدام نموذج التعليمات البرمجية التالي لتنفيذ المهام الشائعة عند العمل مع IDENTITY الأعمدة.
العمود C1 هو في IDENTITY جميع المهام التالية.
ابحث عن أعلى قيمة مخصصة للجدول
استخدم الدالة MAX() لتحديد أعلى قيمة مخصصة لجدول موزع:
SELECT MAX(C1)
FROM dbo.T1
ابحث عن الأصل والزيادة في خاصية IDENTITY
يمكنك استخدام عروض الكتالوج لاكتشاف زيادة الهوية وقيم التكوين الأولية للجدول باستخدام الاستعلام التالي:
SELECT sm.name
, tb.name
, co.name
, ic.seed_value
, ic.increment_value
FROM sys.schemas AS sm
JOIN sys.tables AS tb ON sm.schema_id = tb.schema_id
JOIN sys.columns AS co ON tb.object_id = co.object_id
JOIN sys.identity_columns AS ic ON co.object_id = ic.object_id
AND co.column_id = ic.column_id
WHERE sm.name = 'dbo'
AND tb.name = 'T1'
;