نوشته جان واتسون
معمولا با این سوال مواجه می شوم که چگونه می توان یک ستون را در جدول دقیقا بین دو ستون مشخص اضافه نمود؟ جواب هایی که به این سوال داده می شود معمولا به دو صورت است : الف- شما نمی توانید این کار را انجام دهید ب- فرض کنید که اصلا بتوانید چنین کاری را انجام دهید، این کار چه سودی برای شما دارد؟
در اینجا نمی خواهم با جزئیات بگویم که این کار چه سودی برای ما می تواند داشته باشد! شاید دلیلی که پاسخ دهندگان نوع (ب) می آورند این است که معمولا برنامه نویسان با یک دستور * Select به جستجوی ستون های مورد نظرشان می پردازند و ترتیب ستون ها اصلا برایشان اهمیتی ندارد. اما می خواهم نکته ای را برای شما بازگو کنم. استفاده از دستور * Select از نظر برنامه نویسی اشکالاتی دارد و یک برنامه نویس قوی معمولا از این روش برای کد های SQL استفاده نمی کند؟
بهرحال بیایید فرض کنیم که به هر دلیلی می خواهیم این کار را انجام دهیم. یعنی ستونی را مابین دو ستون مشخص جدول ایجاد کنیم. برای این کار با استفاده از پایگاه داده اوراکل 12C و با استفاده از کاربر دوست داشتنی Scott و رمز معروفش tiger شروع به نوشتن کد زیر می کنیم :
orclz> desc dept
Name Null? Type
----------------------------------------------------------- -------- ----------------------------------------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
orclz>
حالا می خواهیم ستون TOTSAL را مابین ستون های DNAME و LOC ایجاد کنیم. به شیوه زیر عمل می کنیم:
orclz>
orclz> alter table dept add (totsal number);
Table altered.
orclz> desc dept;
Name Null? Type
----------------------------------------------------------- -------- ----------------------------------------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
TOTSAL NUMBER
orclz> select * from dept;
DEPTNO DNAME LOC TOTSAL
---------- -------------- ------------- ----------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
orclz>
ستون جدید در انتهای ستون ها قرار می گیرد. حالا نکته ای جدید از نسخه 12C را به شما نشان می دهیم. ابتدا LOC را پنهان و سپس آشکار می کنیم :
orclz>
orclz> alter table dept modify (loc invisible);
Table altered.
orclz> select * from dept;
DEPTNO DNAME TOTSAL
---------- -------------- ----------
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS
orclz> alter table dept modify (loc visible);
Table altered.
orclz> select * from dept;
DEPTNO DNAME TOTSAL LOC
---------- -------------- ---------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
orclz>
چه اتفاقی افتاد! ظاهرا ترتیب ستون ها عوض شد ؟ بیایید بررسی کنیم که چه اتفاقی ممکن است افتاده باشد؟
orclz>
orclz> select column_name,hidden_column,column_id from user_tab_cols where table_name='DEPT';
COLUMN_NAME HID COLUMN_ID
------------------------------ --- ----------
DEPTNO NO 1
DNAME NO 2
LOC NO 4
TOTSAL NO 3
orclz> desc dept
Name Null? Type
----------------------------------------------------------- -------- ----------------------------------------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
TOTSAL NUMBER
LOC VARCHAR2(13)
orclz> alter table dept modify (dname invisible);
Table altered.
orclz> desc dept
Name Null? Type
----------------------------------------------------------- -------- ----------------------------------------
DEPTNO NOT NULL NUMBER(2)
TOTSAL NUMBER
LOC VARCHAR2(13)
orclz> select column_name,hidden_column,column_id from user_tab_cols where table_name='DEPT';
COLUMN_NAME HID COLUMN_ID
------------------------------ --- ----------
TOTSAL NO 2
LOC NO 3
DNAME YES
DEPTNO NO 1
orclz> alter table dept modify (dname visible);
Table altered.
orclz> desc dept
Name Null? Type
----------------------------------------------------------- -------- ----------------------------------------
DEPTNO NOT NULL NUMBER(2)
TOTSAL NUMBER
LOC VARCHAR2(13)
DNAME VARCHAR2(14)
orclz> select column_name,hidden_column,column_id from user_tab_cols where table_name='DEPT';
COLUMN_NAME HID COLUMN_ID
------------------------------ --- ----------
TOTSAL NO 2
LOC NO 3
DNAME NO 4
DEPTNO NO 1
orclz> select * from dept;
DEPTNO TOTSAL LOC DNAME
---------- ---------- ------------- --------------
10 NEW YORK ACCOUNTING
20 DALLAS RESEARCH
30 CHICAGO SALES
40 BOSTON OPERATIONS
orclz>
به نظر می رسد هنگامیکه یک ستون را پنهان می کنیم Column-id آن Null می گردد و Column-id ستون های دیگر متناسب با آن تنظیم می گردند. بعد از اینکه آن را آشکار می کنیم اولین Column-id موجود را می گیرد دقیقا بعد از ستون های دیگر. البته این روش می تواند روشی سریع برای شما باشد اما بهتر است برای انجام چنین کاری از ویوها استفاده کنید و البته شاید بهتر باشد اصلا از * Select استفاده نکنید و نام ستون ها را به صراحت در پرس و جویتان مورد استفاده قرار دهید.