user_tab_columns和user_tab_cols的區別!
user_tab_cols differs from "USER_TAB_COLUMNS" in that hidden columns are not filtered out。10.2版本中user_tab_cols比user_tab_columns多出下面幾列:
HIDDEN_COLUMN VARCHAR2(3)
VIRTUAL_COLUMN VARCHAR2(3)
SEGMENT_COLUMN_ID NUMBER
INTERNAL_COLUMN_ID NOT NULL NUMBER
QUALIFIED_COL_NAME VARCHAR2(4000)
簡單的測試過程如下:
SQL> desc tt
名稱 是否為空? 型別
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER(38)
NAME VARCHAR2(10)
AGE NUMBER(38)
COL_HIDDEN_TEST CHAR(1)
SQL> alter table tt set unused column col_hidden_test;
表已更改。
SQL> select column_name,hidden_column,virtual_column,
2 segment_column_id scid,internal_column_id icid,
3 qualified_col_name
4 from user_tab_cols where table_name='TT'
5 order by segment_column_id;
COLUMN_NAME HID VIR SCID ICID QUALIFIED_COL_NAME
-------------------------- --- --- ---- ---- --------------------------
ID NO NO 1 1 ID
NAME NO NO 2 2 NAME
AGE NO NO 3 3 AGE
SYS_C00004_08041522:48:47$ YES NO 4 4 SYS_C00004_08041522:48:47$
SQL> select column_name from user_tab_columns where table_name='TT';
COLUMN_NAME
--------------------------
ID
NAME
AGE
SQL>
被設定為unused 的column在user_tab_columns裡面沒有了記錄,而在user_tab_cols中是有記錄的。
另外值得一提的是VIRTUAL_COLUMN是11g的新特性,這裡為什麼會出現在10g的關於user_tab_cols的描述中?莫非10g中VIRTUAL_COLUMN有另外的含義?
下面是11g中VIRTUAL_COLUMN的一點測試:
SQL> create table test(col1 int, col2 int,i3 as (col1+col2) virtual);
表已建立。
SQL> create table test1(col1 int, col2 int,i3 as (col1+col2));
表已建立。
SQL> insert into test values(1,2,3);
insert into test values(1,2,3)
*
第 1 行出現錯誤:
ORA-54013: 不允許對虛擬列執行 INSERT 操作
SQL> insert into test(col1,col2) values(1,2);
已建立 1 行。
SQL> select * from test;
COL1 COL2 I3
---------- ---------- ----------
1 2 3
SQL> commit;
提交完成。
SQL>
SQL> select column_name,hidden_column,virtual_column,
2 segment_column_id scid,internal_column_id icid,
3 qualified_col_name
4 from user_tab_cols where table_name='TEST'
5 order by segment_column_id;
COLUMN_NAME HID VIR SCID ICID QUALIFIED_COL_NAME
-------------------------- --- --- ---- ---- --------------------------
COL1 NO NO 1 1 COL1
COL2 NO NO 2 2 COL2
I3 NO YES 3 I3
SQL> select column_name from user_tab_columns where table_name='TEST';
COLUMN_NAME
--------------------------
COL1
COL2
I3
SQL>
這裡的虛擬列儘管在 user_tab_cols 中的欄位virtual_column=YES
但是在欄位在user_tab_columns 中同樣有記錄,和10g中user_tab_cols 中virtual_column意義存在一些差別:
10g中建立的函式index表現出來的也是virtual_column的特性。
SQL> create index idx_tt on tt(upper(name));
索引已建立。
SQL> select column_name from user_tab_columns where table_name='TT';
COLUMN_NAME
------------------------------
ID
NAME
AGE
SQL> select column_name,hidden_column,virtual_column,
2 segment_column_id scid,internal_column_id icid,
3 qualified_col_name
4 from user_tab_cols where table_name='TT'
5 order by segment_column_id;
COLUMN_NAME HID VIR SCID ICID QUALIFIED_COL_NAME
-------------------------- --- --- ---- ---- ------------------------------
ID NO NO 1 1 ID
NAME NO NO 2 2 NAME
AGE NO NO 3 3 AGE
SYS_C00004_08041522:48:47$ YES NO 4 4 SYS_C00004_08041522:48:47$
SYS_NC00005$ YES YES 5 SYS_NC00005$
SQL>
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19602/viewspace-1002590/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫系統檢視USER_TAB_COLS和USER_TAB_COLUMNS 【轉】Oracle資料庫
- ../和./和/的區別
- 和 的區別
- as 和 with的區別
- ||和??的區別
- /*和/**的區別
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- http和https的區別/get和post的區別HTTP
- ./ 和sh 的區別
- JQuery this和$(this)的區別jQuery
- jquery $(this) 和this的區別jQuery
- T和?的區別
- ++a和a++的區別
- makefile =和:=的區別
- Mybatis中#{}和${}傳參的區別及#和$的區別小結MyBatis
- 和區別
- MYSQL和SQL的區別MySql
- varchar和char的區別
- &self 和 self 的區別
- var和public的區別
- filter和interceptor的區別Filter
- useEffect 和 useLayoutEffect 的區別
- SDK和API的區別?API
- var 和 let 的區別
- WebApi和MVC的區別WebAPIMVC
- service和systemctl的區別
- GET和POST的區別?
- GET和POST的區別
- button和submit的區別MIT
- GET 和 POST 的區別
- 【Java】equals 和 == 的區別Java
- django和flask的區別DjangoFlask
- promise 和 Observable 的區別Promise
- sass和less的區別
- POST 和 GET 的區別
- cookie和session的區別CookieSession
- MTV和MVC的區別MVC
- mysql中!=和is not的區別MySql