SET COLINVISIBLE ON xb@PDB12C> @desc t2 Name Null? Type ------------------------------- -------- ---------------------------- 1 A NUMBER(38) 2 C NOT NULL NUMBER(38) 3 B (INVISIBLE) NUMBER(38)
xb@PDB12C> @desc t2; Name Null? Type ------------------------------- -------- ---------------------------- 1 A NUMBER(38) 2 C NOT NULL NUMBER(38) 3 B NUMBER(38)
SELECT COLUMN_NAME, COLUMN_ID, HIDDEN_COLUMN FROM USER_TAB_COLS WHERE TABLE_NAME ='T2';
COLUMN_NAME COLUMN_ID HID -------------------- ---------- --- A 1 NO B 3 NO C 2 NO
可以看到将字段B重新可见后,它的COLUMN_ID发生了改变,所以要注意的是如果这时你再通过INSERT INTO T2插入数据时,第二个值不是插到B,而是C,所以在写sql的时候一定注意规范,将插入的字段名称都写在语句里。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
INSERT INTO t2 VALUES(6, 7, 8);
SELECT * FROM t2;
A C B ---------- ---------- ---------- 1 2 3 5 4 6 7 8
将NOT NULL字段不可见
1 2 3 4 5 6 7 8
ALTER TABLE t2 modify(c invisible);
INSERT INTO t2 VALUES(5, 6); * ERROR at line 1: ORA-01400: cannot insert NULL into ("XB"."T2"."C")
所以即使字段不可见,但是因为有非空约束,所以还是要插入非空值到列
1 2 3 4 5 6
INSERT INTO t2 (a,b,c) VALUES(5, 6, 7);
1 row created.
当非空字段有默认值的时候,那插入就不会有问题了。
不可见列上的约束键
不可见列上也时可以创建主键和外键约束的,与其他字段没什么区别
1 2 3
CREATE TABLE test1(a number,b number invisible PRIMARY KEY);
CREATE TABLE test2(c number, d number invisible REFERENCES test1(b));