نظام قواعد البيانات MS SQL Server يتيح لك استخدام الـ Sequence Object والـ Identity Property من أجل توليد رقم تسلسلي تلقائي، ومع ذلك هناك العديد من الاختلافات بينهما، وفي هذا المقال سنتعرف على هذه الاختلافات.

هذه الصورة عبارة ملخص لما سيتم ذكره في هذا المقال إذا كنت بحاجة إلى مزيد من التفاصيل يمكنك متابعة القراءة 🙂

أهم الاختلافات بين الـ Sequence والـ Identity
أهم الاختلافات بين الـ Sequence والـ Identity

الاختلاف الأول

الـ Identity هي عبارة عن خاصية من خصائص أعمدة الجدول، أي أنها مرتبطة بجدول معين ولا يمكن مشاركتها أو استخدامها مع أكثر من جدول.

أما الـ Sequence فهو عبارة عن كائن يحتوي على مجموعة من الخصائص ويتم تعريفه من قبل المستخدم، كما أنه غير مرتبط بجدول معين من جداول قاعدة البيانات أي أن يمكن استخدامه مع أكثر من جدول.

لتوضيح هذا الاختلاف أكثر قم بتنفيذ هذه الأسطر البرمجية

CREATE Database ShowRoom;
GO
 
USE ShowRoom;
CREATE TABLE Cars1
(
    id INT PRIMARY KEY IDENTITY(1,1),
    name VARCHAR(50) NOT NULL,
    company VARCHAR(50) NOT NULL,
    power INT NOT NULL
 )
 
 
CREATE TABLE Cars2
(
    id INT,
    name VARCHAR(50) NOT NULL,
    company VARCHAR(50) NOT NULL,
    power INT NOT NULL
 )
 
 CREATE TABLE Cars3
(
    id INT,
    name VARCHAR(50) NOT NULL,
    company VARCHAR(50) NOT NULL,
    power INT NOT NULL
)

في المثال السابق قمنا بإنشاء قاعدة بيانات باسم ShowRoom تحتوي على ثلاث جداول وهي (cars1, cars2, cars3) ومن خصائص العمود Id في الجدول cars1 قمنا بإضافة الخاصية Identity من أجل الترقيم التلقائي بحيث يبدأ الترقيم من الرقم 1 وبزيادة 1 في كل عملية إضافة، بينما الجدولين cars2, cars3 لم يتم إضافة هذه الخصية لهما.

الآن دعنا نقوم بإنشاء Sequence جديد باسم SequenceCounter

CREATE SEQUENCE [dbo].[SequenceCounter]
 AS INT
 START WITH 1
 INCREMENT BY 1

بعد أن قمنا بإنشاء الـ Sequence يمكننا مشاركته مع عدة جدوال، لذلك سنستخدمه مع الجدول cars2 والجدول cars3

ومن أجل استخدامه نقوم بكتابة الجملة NEXT VALUE FOR SEQUENCE_NAME أثناء عملية إضافة البيانات للجدول ووظيفتها الرجوع بالقيمة التالية للـ Sequence.

دعنا نقوم بإضافة بيانات للجدول cars2

INSERT INTO Cars2 VALUES (NEXT VALUE FOR [dbo].[SequenceCounter], '208', 'Peugeot', 5400)
INSERT INTO Cars2 VALUES (NEXT VALUE FOR [dbo].[SequenceCounter], 'C500', 'BMW', 8000)
INSERT INTO Cars2 VALUES (NEXT VALUE FOR [dbo].[SequenceCounter], 'C500', 'Peugeot', 5400)

وسنقوم أيضًا بإضافة بيانات للجدول cars3 مع استخدام نفس الـ Sequence

INSERT INTO Cars3 VALUES (NEXT VALUE FOR [dbo].[SequenceCounter], 'C500', 'Mercedez', 5000)
INSERT INTO Cars3 VALUES (NEXT VALUE FOR [dbo].[SequenceCounter], 'Prius', 'Toyota', 3200)
INSERT INTO Cars3 VALUES (NEXT VALUE FOR [dbo].[SequenceCounter], 'Civic', 'Kia', 1800)

والآن عند عرض البيانات من كلا الجدولين سنلاحظ أن قيم العمود Id في الجدول cars2 هي 1-2-3 وفي الجدول cars3 هي 4-5-6 وهذا يرجع لأننا قمنا باستخدام نفس الـ Sequence لكلا الجدولين.

SELECT * FROM Cars2
SELECT * FROM Cars3
نتيجة جملتي الاستعلام

الاختلاف الثاني

من أجل توليد قيمة جديدة للترقيم التسلسلي في الخاصية Identity فأنت بحاجة إلى إدراج سجل جديد في الجدول، أما في الـ Sequence يتم ذلك عن طريق استخدام جملة NEXT VALUE FOR SEQUENCE_NAME من أجل توليد قيمة جديدة دون الحاجة إلى إضافة سجل جديد في الجدول.

لتوضيح ذلك عن طريق التطبيق العملي، سنقوم بإضافة سجل جديد للجدول الذي أنشأناه مسبقًا cars1، ولأننا قمنا بإضافة الخاصة Identity للعمود Id فأنه سيتم توليد قيمته تلقائيًا.

INSERT INTO Cars1 VALUES ('Corrolla', 'Toyota', 1800)

أما في الـ Sequence فيكفي استخدام الجملة NEXT VALUE FOR SEQUNCE_NAME كما في المثال التالي:

SELECT NEXT VALUE FOR [dbo].[SequenceCounter]
نتيجة جملة الاستعلام السابقة

كما تلاحظ فإن قيمة الـ Sequence كانت 6 والآن أصبحت 7 دون إضافة أي صفوف لأي جدول.

الاختلاف الثالث

لا يمكن إعادة تعيين قيمة الخاصية Id، بينما يمكن ذلك في الـ Sequence، وللقيام بذلك يجب عليك تحديد الحد الأدنى والحد الأقصى للـ Sequence مع تحديد الخاصية CYCLE كما موضح في جملة الإستعلام التلية:

CREATE SEQUENCE [dbo].[RecycleSequence]
 AS INT
 START WITH 1
 INCREMENT BY 1
 MINVALUE 1
 MAXVALUE 3
 CYCLE

في الأسطر السابقة سيتم إعادة تعيين قيمة الـ Sequence بمجرد الوصول إلى قيمة الحد الأقصى وهو 3، لذلك إذا قمت بتنفيذ الجملة التالية أربع مرات، فسيقوم الـ Sequence بإرجاع الرقم 1.

SELECT NEXT VALUE FOR [dbo].[RecycleSequence]

الاختلاف الرابع

لا يمكننا تحديد الحد الأقصى لقيمة الخاصية Identity، بينما يمكننا ذلك في الـ Sequence

قيمة الحد الأقصى للخاصية Identity تعتمد على نوع بيانات العمود، على سبيل المثال في الجدول cars1 نوع البيانات للعمود Id هو int أي أن القيمة القصوى للخاصية Identity ستكون نفسها القيمة القصوى لنوع البيانات int

أما في الـ Sequence يمكننا استخدام الخاصية MAXNVAUE لتحديد القيمة القصوى، كما هو موضح في المثال التالي:

CREATE SEQUENCE [dbo].[MaxSequence]
 AS INT
 START WITH 1
 INCREMENT BY 1
 MAXVALUE 3

في المثال السابق قمنا بإنشاء Sequence مع تحديد القيمة القصوى له وهي 3، فإذا قمت بتوليد قيمة جديدة بعد 3 سينتج لك الخطأ التالي.