[20210421]12c以上版本增加欄位與預設值.txt
[20210421]12c以上版本增加欄位與預設值.txt
--//昨天在最佳化sql語句時,發現過濾條件有點奇怪,才發現是12c以上增加欄位與預設值導致的情況。
--//今天測試各種增加欄位的情況。
1.環境:
TTT@192.168.2.7:1521/orcl> @ prxx
==============================
PORT_STRING : x86_64/Linux 2.4.xx
VERSION : 18.0.0.0.0
BANNER : Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
BANNER_FULL : Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
BANNER_LEGACY : Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
CON_ID : 0
PL/SQL procedure successfully completed.
2.測試:
create table t (a number);
insert into t select rownum from dual connect by rownum <=3;
commit;
--//分析略。
alter table t add ( b number default 1 );
alter table t add ( c number default 2 not null);
alter table t add ( d number );
alter table t add ( e number default on null 4);
--//注:我所知道就這麼4種,也許還有其它方式。
alter table t add ( f number default 5 );
TTT@192.168.2.7:1521/orcl> @desc t
Name Null? Type
----- -------- --------
1 A NUMBER
2 B NUMBER
3 C NOT NULL NUMBER
4 D NUMBER
5 E NOT NULL NUMBER
6 F NUMBER
TTT@192.168.2.7:1521/orcl> select OBJECT_ID,DATA_OBJECT_ID from dba_objects where object_name='T';
OBJECT_ID DATA_OBJECT_ID
---------- --------------
252156 252156
TTT@192.168.2.7:1521/orcl> select TABOBJ#,COLNUM,BINARYDEFVAL,GUARD_ID from sys.ecol$ a;
TABOBJ# COLNUM BINARYDEFVAL GUARD_ID
------------ ------------ ------------------------------ ------------
252156 3 C102 0
252156 6 C105
252156 4 C103
252156 7 C106 1
--//guard_id表示順序。
SELECT obj#
,col#
,segcol#
,INTCOL#
,name
,default$
,null$
,type#
,PROPERTY
FROM sys.col$
WHERE obj# IN (SELECT object_id
FROM dba_objects
WHERE owner = 'TTT' AND object_name = 'T')
ORDER BY INTCOL#;
OBJ# COL# SEGCOL# INTCOL# NAME DEFAULT$ NULL$ TYPE# PROPERTY
------ ---- ------- ------- ----------- -------- ----- ----- ------------
252156 1 1 1 A 0 2 0
252156 0 2 2 SYS_NC00002 0 23 549755814176
252156 2 3 3 B 1 0 2 1073741824
252156 3 4 4 C 2 1 2 1073741824
252156 4 5 5 D 0 2 0
252156 5 6 6 E 4 1 2 69793218560
252156 6 7 7 F 5 0 2 1073741824
7 rows selected.
--//順便說明COL#,SEGCOL#,INTCOL#關係。
--// SEGCOL# 表示在資料段的儲存順序,按照 A,SYS_NC00002$,B,C,D,E,F.
--// INTCOL# 表示定義表時的定義欄位的順序,這裡與SEGCOL#順序一致,有時候會出現不一致的情況,比如IOT表,其主鍵在資料塊儲存中在
--// 最前面。
--// col# 不等於0的列顯示。換一句話將0表示隱含列。按照select * from t的欄位顯示順序.
--//可以參考
--//12c有一個新特性隱藏列,這樣就可以改變顯示順序,大家可以自行探究。
--//似乎以下兩個是很類似,PROPERTY不同。e欄位可以插入null,實際上進入插入的是4.
--//69793218560=1000001000000000000000000000000000000(二進位制)
--//1073741824 = 1000000000000000000000000000000(二進位制)
alter table t add ( c number default 2 not null);
alter table t add ( e number default on null 4);
TTT@192.168.2.7:1521/orcl> insert into t (a ) values (4);
1 row created.
insert into t (a,e ) values (5,NULL);
TTT@192.168.2.7:1521/orcl> commit ;
Commit complete.
TTT@192.168.2.7:1521/orcl> select t.*,SYS_NC00002$ c10 from t ;
A B C D E F C10
-- -- -- -- -- -- ----
1 1 2 4 5
2 1 2 4 5
3 1 2 4 5
4 1 2 4 5 03
5 1 2 4 5 03
--//A=5對應的E=4,即使插入是NULL.
TTT@192.168.2.7:1521/orcl> @ dpc '' advanced
...
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - "T"."A"[NUMBER,22],
"SYS_NC00002$"[RAW,126],
DECODE(TO_CHAR(SYS_OP_VECBIT("SYS_NC00002$",0)),NULL,NVL("T"."B",1),'0',NVL("T"."B",1),'1',"T"."B")[22],
NVL("T"."C",2)[22],
"T"."D"[NUMBER,22],
NVL("T"."E",4)[22],
DECODE(TO_CHAR(SYS_OP_VECBIT("SYS_NC00002$",1)),NULL,NVL("T"."F",5),'0',NVL("T"."F",5),'1',"T"."F")[22]
3.看看塊的轉儲情況:
TTT@192.168.2.7:1521/orcl> select rowid,t.*,SYS_NC00002$ c10 from t ;
ROWID A B C D E F C10
------------------ -- -- -- -- -- -- ----
AAA9j8AAMAAAACHAAA 1 1 2 4 5
AAA9j8AAMAAAACHAAB 2 1 2 4 5
AAA9j8AAMAAAACHAAC 3 1 2 4 5
AAA9j8AAMAAAACHAAE 4 1 2 4 5 03
AAA9j8AAMAAAACHAAF 5 1 2 4 5 03
TTT@192.168.2.7:1521/orcl> @ rowid AAA9j8AAMAAAACHAAA
OBJECT FILE BLOCK ROW ROWID_DBA DBA TEXT
------------ ------------ ------------ ------------ -------------------- -------------------- ----------------------------------------
252156 12 135 0 0x3000087 12,135 alter system dump datafile 12 block 135
TTT@192.168.2.7:1521/orcl> @ rowid_abs AAA9j8AAMAAAACHAAF TTT T
OBJECT FILE_ABS FILE BLOCK ROW ROWID_DBA DBA TEXT
---------- ---------- ---------- ---------- ---------- -------------------- -------------------- ----------------------------------------
252156 41 12 135 5 0x3000087 12,135 alter system dump datafile 41 block 135
--//說明使用cdb資料庫,相對檔案號與絕對檔案號不同.
TTT@192.168.2.7:1521/orcl> alter system dump datafile 41 block 135;
System altered.
--//檢查轉儲:
Block header dump: 0x03000087
Object id on Block? Y
seg/obj: 0x3d8fc csc: 0x0000000058dc696b itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x3000080 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0007.005.00012658 0x02400930.3209.19 --U- 2 fsc 0x0000.58dc6a4b
0x02 0x000a.001.0001bf15 0x02401532.6f2b.3b --U- 1 fsc 0x0000.58dc6f3b
bdba: 0x03000087
data_block_dump,data header at 0x7f4851c0f064
===============
tsiz: 0x1f98
hsiz: 0x1e
pbl: 0x7f4851c0f064
76543210
flag=--------
ntab=1
nrow=6
frre=-1
fsbo=0x1e
fseo=0x1f4a
avsp=0x1f33
tosp=0x1f35
0xe:pti[0] nrow=6 offs=0
0x12:pri[0] offs=0x1f86
0x14:pri[1] offs=0x1f8c
0x16:pri[2] offs=0x1f92
0x18:pri[3] offs=0x1f74
0x1a:pri[4] offs=0x1f5f
0x1c:pri[5] offs=0x1f4a
block_row_dump:
tab 0, row 0, @0x1f86
tl: 6 fb: --H-FL-- lb: 0x0 cc: 1
col 0: [ 2] c1 02
tab 0, row 1, @0x1f8c
tl: 6 fb: --H-FL-- lb: 0x0 cc: 1
col 0: [ 2] c1 03
tab 0, row 2, @0x1f92
tl: 6 fb: --H-FL-- lb: 0x0 cc: 1
col 0: [ 2] c1 04
tab 0, row 3, @0x1f74
tl: 2 fb: --HDFL-- lb: 0x1
tab 0, row 4, @0x1f5f
tl: 21 fb: --H-FL-- lb: 0x1 cc: 7
col 0: [ 2] c1 05
col 1: [ 1] 03
col 2: [ 2] c1 02
col 3: [ 2] c1 03
col 4: *NULL*
col 5: [ 2] c1 05
col 6: [ 2] c1 06
tab 0, row 5, @0x1f4a
tl: 21 fb: --H-FL-- lb: 0x2 cc: 7
col 0: [ 2] c1 06
col 1: [ 1] 03
col 2: [ 2] c1 02
col 3: [ 2] c1 03
col 4: *NULL*
col 5: [ 2] c1 05
col 6: [ 2] c1 06
end_of_block_dump
--//後面插入的記錄都寫盤了。
--//另外我在想是否開發應該瞭解這些增加欄位的優缺點。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2769203/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle增加欄位帶預設值Oracle
- MySQL修改欄位預設值MySql
- sql設定欄位預設值SQL
- 查詢oracle欄位預設值Oracle
- MySQL欄位預設值設定詳解MySql
- [20140823]12c null與預設值.txtNull
- 通用SQL語句修改欄位預設值SQL
- [20160713]修改表結構增加1列與預設值.txt
- jpa~為欄位新增insert的預設值
- SharePoint 多行文字欄位設定預設值
- oracle時間欄位預設值,hibernate對映Oracle
- 【COLUMN】設定表欄位預設值僅對未來生效
- mysql datetime增加預設值MySql
- Django日期欄位預設值default=timezone.nowDjango
- pydantic 欄位的預設值設定獲取當前時間
- [20190107]12c以上版本配置dg注意.txt
- Sqlserver的欄位datetime型別預設值設為getdate()時,設值毫秒為000SQLServer型別
- SQL Server語句刪除帶有預設值的欄位SQLServer
- EBS:主鍵ID欄位預設值來源於序號
- MySQL-修改欄位型別、設定預設值,以及新增註釋MySql型別
- 對錶中的欄位設定了預設值,新增記錄後卻發現該欄位為nullNull
- laravel欄位減少增加Laravel
- [BUG反饋]新建欄位無法使用字元型預設值字元
- Oracle 增加修改刪除欄位與新增註釋Oracle
- sql語句修改欄位型別和增加欄位SQL型別
- oracle刪除表欄位和oracle表增加欄位Oracle
- [20230308]12c以上版本模糊查詢問題.txt
- 小書MybatisPlus第9篇-常用欄位預設值自動填充MyBatis
- MySQL多個timestamp欄位自動新增預設值的問題MySql
- [BUG反饋]8.25版本的install.sql裡面所有text型別欄位都設了預設值SQL型別
- Oracle 增加修改刪除欄位Oracle
- 為React Ant-Design Table增加欄位設定React
- mysql-欄位設定Default值問題MySql
- [BUG反饋]模型增加欄位BUG模型
- Request 增加自定義欄位的方式
- 建議欄位別名定義定義那裡順便可定義預設值,這預設值還可以是函式函式
- [BUG反饋]模型增加欄位後field_sort欄位未更新模型
- 【Mongo】mongo更新欄位為另一欄位的值Go