技術ブログ
Oracle Database 12cより 不可視(INVISIBLE)という列の属性が追加され、実体としては存在するけれども、明示的に指定しない限り見えない列を作ることができるようになりました。
動作を確認してみましょう。なお、以下のブログエントリを大いに参考にしています。
SQL> CREATE TABLE t1
2 (
3 c1 NUMBER,
4 c2 NUMBER,
5 c3 NUMBER INVISIBLE,
6 c4 NUMBER
7 );
Table created.
SQL> set lines 80
SQL> desc t1
Name Null? Type
------------------------------- -------- ----------------------------
1 C1 NUMBER
2 C2 NUMBER
3 C4 NUMBER
SQL> col column_name format a16
SQL> SELECT column_name, hidden_column FROM ALL_TAB_COLS WHERE table_name = 'T1';
COLUMN_NAME HID
---------------- ---
C4 NO
C3 YES
C2 NO
C1 NO
列c3にINVISIBLE属性を指定し、不可視列にしています。SQL*Plusのdescでは列c3は表示されません。 また、ALL_TAB_COLSを確認する列c3はhidden_column='YES'となっていることがわかります。
SQL> INSERT INTO t1 (c1,c2,c3,c4) VALUES (11,12,13,14);
1 row created.
SQL> commit;
Commit complete.
SQL> SELECT c1,c2,c3,c4 FROM t1;
C1 C2 C3 C4
---------- ---------- ---------- ----------
11 12 13 14
SQL> UPDATE t1 SET c3=23;
1 row updated.
SQL> commit;
Commit complete.
SQL> SELECT c1,c2,c3,c4 FROM t1;
C1 C2 C3 C4
---------- ---------- ---------- ----------
11 12 23 14
しかし、c3列を明示的に指定すれば、更新などは可能です。
なお、SQL*PlusのCOLINVISIBLEをONにすると、 不可視列がdescコマンドで表示されるようになります。
SQL> SET COLINVISIBLE ON
SQL> desc t1
Name Null? Type
------------------------------- -------- ----------------------------
1 C1 NUMBER
2 C2 NUMBER
3 C4 NUMBER
4 C3 (INVISIBLE) NUMBER
SQL> SET COLINVISIBLE OFF
c3列を明示的に指定しない場合は、あたかも列c3がいないかのように振る舞います。
SQL> INSERT INTO t1 VALUES (11,12,13,14);
INSERT INTO t1 VALUES (11,12,13,14)
*
ERROR at line 1:
ORA-00913: too many values
SQL> SELECT * FROM t1;
C1 C2 C4
---------- ---------- ----------
11 12 14
SQL> ALTER TABLE t1 MODIFY c3 VISIBLE;
Table altered.
SQL> desc t1
Name Null? Type
------------------------------- -------- ----------------------------
1 C1 NUMBER
2 C2 NUMBER
3 C4 NUMBER
4 C3 NUMBER
列の順序が変わるということは、列名を明示しないSQL、SELECT * FROM .. や INSERT INTO 表名 VALUES(...)の振る舞いが 期待した動作にならないことを示します。要注意ですね。