اوراکل 23c- قابلیت DEFAULT ON NULL برای update و insert

از نسخه های قدیمی اوراکل این امکان را داشتیم که برای ستونهای جداول، مقدار پیش فرض و یا همان Default Value تعریف کنیم.

با تنظیم Default Value برای یک ستون، اگر در زمان اجرای دستور insert مقداری را برای آن ستون لحاظ نکرده باشیم، Default Value برای آن ستون اعمال خواهد شد:

SQL*Plus: Release 10.1.0.4.2 - Production on Sat Aug 5 16:28:29 2023
SQL> create table tbl1(id number,tarikh date default sysdate+1);
Table created.
SQL> insert into tbl1(id) values(1);
1 row created.
SQL> select * from tbl1;
        ID TARIKH
---------- ---------
         1 06-AUG-23

در این شرایط اگر به صراحت مقدار NULL را برای ستون tarikh در نظر بگیریم چه اتفاقی می افتد؟

SQL> insert into tbl1 values(2,null); 
1 row created.
SQL> select * from tbl1;
        ID TARIKH
---------- ---------
         1 06-AUG-23
         2

همانطور که می بینید، Default value در این حالت اعمال نشده است!

اوراکل در نسخه 12cR1 قابلیتی را اضافه کرده تا بتوان در این حالت هم مقدار Default Value به جای NULL برای ستون مورد نظر اعمال شود:

SQL*Plus: Release 12.1.0.2.0 Production on Sat Aug 5 16:30:29 2023
SQL> create table tbl1(id number,tarikh date default on null sysdate+1);
Table created.
SQL> insert into tbl1(id) values(1);
1 row created.
SQL> select * from tbl1;
        ID TARIKH
---------- ---------
         1 06-AUG-23
SQL> insert into tbl1 values(2,null);
1 row created.
SQL> select * from tbl1;
        ID TARIKH
---------- ---------
         1 06-AUG-23
         2 06-AUG-23

در این شرایط، با توجه به شرط default on null امکان تنظیم مقدار ستون tarikh به مقدار null وجود ندارد:

SQL> update tbl1 set TARIKH=null where id=1;
ORA-01407: cannot update ("USEF"."TBL1"."TARIKH") to NULL

اوراکل در نسخه 23c قابلیت جدیدی را در این زمینه ارائه کرده که از طریق آن می توان Default Value را در زمان update هم اعمال کرد به این صورت که اگر کاربری بخواهد مقداری از ستون را به null تغییر دهد، Default Value برای آن ستون لحاظ می شود.

این کار با استفاده از عبارت default on null for insert and update قابل انجام است البته عبارت default on null for insert هم در نسخه 23c اضافه شده که معادل  default on null می باشد:

SQL> create table tbl1(id number,
tarikh1 date default sysdate+1,
tarikh2 date default on null for insert only sysdate+1,
tarikh3 date default on null for insert and update sysdate+1
);
Table created.
SQL> insert into tbl1(id) values(1);
1 row created.
SQL> select * from tbl1;
        ID TARIKH1   TARIKH2   TARIKH3
---------- --------- --------- ---------
         1 06-AUG-23 06-AUG-23 06-AUG-23
SQL>  insert into tbl1 values(2,null,null,null);
1 row created.
SQL> select * from tbl1;
        ID TARIKH1   TARIKH2   TARIKH3
---------- --------- --------- ---------
         1 06-AUG-23 06-AUG-23 06-AUG-23
         2           06-AUG-23 06-AUG-23
SQL> insert into tbl1 values
(
3,
to_date('1402/01/01','YYYY/MM/DD','nls_calendar=persian'),
to_date('1402/01/02','YYYY/MM/DD','nls_calendar=persian'),
to_date('1402/01/03','YYYY/MM/DD','nls_calendar=persian')
);
1 row created.

با درج این رکورد، جدول tbl1 حاوی اطاعات زیر است:

SQL> select * from tbl1;
        ID TARIKH1   TARIKH2   TARIKH3
---------- --------- --------- ---------
         1 06-AUG-23 06-AUG-23 06-AUG-23
         2           06-AUG-23 06-AUG-23
         3 21-MAR-23 22-MAR-23 23-MAR-23

مقدار null را برای ستونهای تاریخ رکورد سوم(id=3) تنظیم می کنیم:

SQL> update tbl1 set TARIKH1=null,TARIKH2=null,TARIKH3=null where id=3;
ORA-01407: cannot update ("USEF"."TBL1"."TARIKH2") to NULL

امکان تنظیم مقدار null برای ستون TARIKH2 وجود ندارد بدون تنظیم این ستون، دستور را تکرار می کنیم:

SQL> update tbl1 set TARIKH1=null,TARIKH3=null where id=3;
1 row updated.

با این دستور مقدار ستون TARIKH1 به NULL تغییر پیدا می کند و Default Value هم برای ستون TARIKH3 اعمال خواهد شد:

SQL> select * from tbl1;
        ID TARIKH1   TARIKH2   TARIKH3
---------- --------- --------- ---------
         1 06-AUG-23 06-AUG-23 06-AUG-23
         2           06-AUG-23 06-AUG-23
         3           22-MAR-23 06-AUG-23

 

ارائه خدمات مشاوره ، پشتیبانی و نصب و راه اندازی پایگاه داده اوراکل در سراسر کشور...................... تلفن: 09128110897 ایمیل:vahidusefzadeh@gmail.com

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *