Unique Constraint با شرط در اوراکل
چگونه می توان Unique Constraint با شرط در اوراکل ایجاد کرد؟ در این خصوص دو روش پیشنهاد می شود که در زیر توضیحات آن داده می شود.
روش اول
فرض مي كنيم كه شما دوفيلد در جدول خود داريد كه بايد مقادير اين دوفيلد بصورت يكتا باشد به شرطي كه مقادير فيلد ديگر شامل يك مجموعه اي از اطلاعات باشد و در غير اينصورت نه.
براي درك بهتر با مثال مطرح مي شود:
يك جدول در اوراکل داريد كه شامل سه فيلد f1,f2,f3 مي باشد . حال مي خواهيد اگر مقادير فيلد f1 شامل (1و2و3 ) بود فيلد f2, f3 بصورت يكتا Unique باشد
create table test
(
f1 number
,f2 varchar2(50)
,f3 number(11)
);
(
f1 number
,f2 varchar2(50)
,f3 number(11)
);
اضافه كردن يك unique function-based index در اوراکل
create unique index test_idx
on test (
case when f1 in (1, 2, 3) then f2
end,
case when f1 in (1, 2, 3) then f3
end
);
on test (
case when f1 in (1, 2, 3) then f2
end,
case when f1 in (1, 2, 3) then f3
end
);
حال دو تا حالت بوجود مي آيد:
-
اول Null,null وقتي كه مقدار فيلد f1 شامل (1, 2, 3) نباشد يعني اينكه حالت يكتا بودن غيرفعال مي شود.
-
دوم مقدار فيلد f2,f3 وقتي كه فيلد f1 شامل (1, 2, 3) باشد يعني اينكه حالت كنترل يكتا بودن فعال مي شود.
نکته: مقادير null,null در Index ظاهر نمي شوند و وقتي كه ديتا وجود داشته باشد در Index ظاهر مي گردد.
مي توانيد با مقادير زير اين موضوع را چك نماييد.
4,’saeed’,15000
3,’armin’,14000
2,’saeed’,10000
4,’saeed’,15000
3,’armin’,14000 ===در اين حالت فعال مي شود و خطاي يكتايي ظاهر مي گردد
3,’armin’,14000
2,’saeed’,10000
4,’saeed’,15000
3,’armin’,14000 ===در اين حالت فعال مي شود و خطاي يكتايي ظاهر مي گردد
ORA-00001: unique constraint (TEST.TEST_IDX) violated
روش دوم
در روش اول اين مسئله را بوسيله unique function-based index در اوراکل حل كرديم. حال در اين قسمت مي خواهيم كه بوسيله virtual columns در اوراکل اين كنترل را ايجاد كنيم.
در اين روش از يك Constraint واقعي استفاده مي كنيم. بدين منظور دوتا فيلد به جدول ايجاد مي كنيم بصورت زير:
alter table test
add (f2_unq varchar2(50 byte) generated always as ((case when f1 in (1, 2, 3) then f2 end)));
add (f2_unq varchar2(50 byte) generated always as ((case when f1 in (1, 2, 3) then f2 end)));
alter table test
add (f3_unq number(11 byte) generated always as ((case when f1 in (1, 2, 3) then f3 end)));
add (f3_unq number(11 byte) generated always as ((case when f1 in (1, 2, 3) then f3 end)));
حال بايد يك Unique Constraint در اوراکل بر روي آن دو فيلدي جديد كه ايجا كرديم بسازيم.
alter table test
add constraint f2_f3_unique
unique (f2_unq,f3_unq);
add constraint f2_f3_unique
unique (f2_unq,f3_unq);
كار ما به اتمام رسيده است و مي توانيد با مقادير مثال قبلي آن را چك كنيد.
امیدوار هستم مورد استفاده دوستان قرار گیرد.
5/5 - (1 امتیاز)
جستجو
مطالب اخیر
نظرات اخیر
- محمد در تبدیل تاریخ ها در اوراکل
- مجتبی خالقداد در پلاگین کد امنیتی اوراکل اپکس(ای پکس)
- سعید حسن پور در تبدیل تاریخ ها در اوراکل
- حسین در تبدیل تاریخ ها در اوراکل
- مهرسا سعادت در نقشه راه اوراکل APEX برای نسخه بعدی
برچسبها
AOP
APEX
apexrad
captcha
CDN
constraint
ebs
epg
forms
index
injection
iran
iranoug
longtype
Materialized-view
Oracle Application Express
orclapex
performance
Persian Sort
plsql
session
sql
standalone
variable scope
XE
امنیت
اوراکل
اپکس
ایران
ایندکس
ایپکس
بنبست
بهینه ساز
تاریخ شمسی
ترجمه
ترفند
حروف فارسی
داکیومنت
داینامیک
شمسی
مرتب سازی فارسی
نصب
نکته
پلاگین
یونیک