مقدمة عن Oracle identity column
في الاصدار 12C من قواعد بيانات إدخلت اوراكل طريقة جديدة لتعريف العمود كـ identity في الجداول وهي نفسAUTO_INCREMENT في MySQL أو IDENTITY في SQL Server.
وتعتبر الـ identity column مفيدة جداً عندما يكون العمود المفتاح الرئيسي primary key في الجدول ، عندما تقوم بإدخال صف جديد الى identity column أو عمود المفتاح الرئيسي ، أوراكل تقوم بتوليد رقم بشكل تلقائي ثم تقوم بإدخال قيم متسلسلة الى العمود.
ولتعريف عمود من نوع identity column يتم إستخدامه كالتالي :-
GENERATED [ ALWAYS | BY DEFAULT [ ON NULL ] ] AS IDENTITY [ ( identity_options ) ]
- أولاً : كلمة GENERATED كلمة إجبارية.
- ثانياً : يمكنك إختيار إحدى الخيارات التالية لتوليد IDENTITY :-
- GENERATED ALWAYS : أوراكل تقوم دائماً بإنشاء قيمة لعمود ألـ IDENTITY ، ومحاولة إدخال قيمة في العمود يعطي أخطاء.
- GENERATED BY DEFAULT : تنشى أوراكل القيمة في عمود في حال عدم إضافة إي قيمة من قبل المستخدم ، وفي حالة قمت بإضافة القيمة ، فستقوم أورأكل بإضافة هذه القيمة ، وبالنسبة لهذا الخيار إذا تم إدخال قيمة Null فستعطي أوراكل خطأ
- GENERATED BY DEFAULT ON NULL : تقوم أورأكل بإضافة قيمة للعمود في حالة قام المستخدم بإدخال قيمة Null أو قيمة فارغة.
- ثالثاً : يمكنك الحصول على المزيد من الخيارات لعمود IDENTITY :-
- START WITH initial_value : القيمة الاولية التي يتم إدخالها الى عمود IDENTITY ، وغالبا ما تكون القيمة الاولية الافتراضية هي 1.
- INCREMENT BY internval_value : يحدد الفترة بين القيم المتولدة ، وغالبا ما تكون القيمة الافتراضية هي 1. CACHE : يحدد مجموعة من القيم التي يجب على اوراكل إنشاؤها مسبقا لتحسين الاداء . يمكن تحديد هذا الخيار للعمود الذي يحتوي على عدد كبير ن الإدخالات.
مثال على Oracle identity column
دعونا ناخذ بعض الامثلة على استخدام Oracle identity
مثال على GENERATED ALWAYS
CREATE TABLE identity_table ( id NUMBER GENERATED ALWAYS AS IDENTITY, description VARCHAR2(100) NOT NULL );العبارة التالية لإضافة صف جديد الى جدول identity_table
INSERT INTO identity_table(description) VALUES('Oracle identity column demo with GENERATED ALWAYS');ونظراً لأننا لم ندخل قيمة الى عمود فد تم إنشاء تلقائيا قيمة متسلسلة تبدأ من 1.
SELECT * FROM identity_table;
INSERT INTO identity_table(id,description) VALUES(2, 'Oracle identity column example with GENERATED ALWAYS ');في هذه الحالة أوركل ستعطي الخطاء التالي :
SQL Error: ORA-32795: cannot insert into a generated always identity column
وهذا بسبب انه تم تعريفه GENERATED ALWAYS ، ولهذا لايمكن قبول أي قيمة مقدمة.
مثال على GENERATED BY DEFAULT
دعونا نقوم بتغير عمود id الى GENERATED BY DEFAULT
DROP TABLE identity_demo; CREATE TABLE identity_demo ( id NUMBER GENERATED BY DEFAULT AS IDENTITY, description VARCHAR2(100) not null );العبارة التالية لعملية إدخال صف جديد الى جدول identity_table
DROP TABLE identity_table; INSERT INTO identity_table(description) VALUES('Oracle identity column demo with GENERATED BY DEFAULT');
وهذه هي النتيجة المتوقعة.
الجملة التالية لعملية إضافة صف جديد الى جدول مع قيمة مدخلة الى عمود id .
INSERT INTO identity_table(id,description) VALUES(2, 'Oracle identity column example with GENERATED BY DEFAULT');وهذه هي النتيجة للقيمة التي تم إدخالها.
SELECT * FROM identity_table;والمثال التي لعملية إدخال قيمة null الى العمود id.
INSERT INTO identity_table(id,description) VALUES(NULL, 'Oracle identity column demo with GENERATED BY DEFAULT, NULL value');سيعطي أوراكل الخطأ التالي :-
SQL Error: ORA-01400: cannot insert NULL into ("OT"."IDENTITY_DEMO"."ID")
مثال على GENERATED BY DEFAULT ON NULL
نقوم اولاً بتغير ال id في جدول identity_table الى GENERATED BY DEFAULT ON NULL
DROP TABLE identity_table; CREATE TABLE identity_table ( id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY, description VARCHAR2(100) not null );العبارة التالية لعملية إدخال صف جديد الى جدول identity_table بدون قيمة في عمود الـ id ، وبشكل تلقائي ستعمل اوراكل على توليد قيمة وإدخالها .
INSERT INTO identity_table(description) VALUES('Oracle identity column demo with no value');R2(100) not null );المثال التالي لعملية إدخل قيمة null الى عمود وذلك بسب ان العمود تم تعريفه كـ GENERATED BY DEFAULT ON NULL ، وستقوم اوراكل بتوليد قيم متسلسلة لإستخدامها في عملية الإدخال
INSERT INTO identity_table(description) VALUES('Oracle identity column demo with null');