Invisible Column – MariaDB 10.3 新機能

MariaDB Server 10.3 から Invisible Columns という新機能が追加されています。今回はこの新機能に関してご説明したいと思います。

Invisible Columns

この新機能では CREATE TABLE / ALTER TABLE 文にて,カラムに INVISIBLE 属性を与えられます。

SELECT * FROM などでワイルドカードを用いてクエリを実行した際に,クエリ結果には Invisible Column は表示されず,取扱いに留意する必要のある個人情報などをよりセキュアに扱うことが可能になります。

また,INSERT 文において明示的にカラム名を指定していない限り、値を割り当てる必要もありません。

Invisible Column は NOT NULL として宣言できますが、デフォルト値が必要です。
また,テーブル内のすべてのカラムを非表示(Invisible Column)にすることはできず,少なくとも1カラムは INVISIBLE を指定しない必要があります。

Invisible Columns のテスト

テスト環境
  • MariaDB Server 10.3.16
NOT NULL + デフォルト値 有無の挙動の違い
CREATE TABLE t (x INT, y INT INVISIBLE, z INT INVISIBLE NOT NULL);
ERROR 4106 (HY000): Invisible column `z` must have a default value

z カラムを NOT NULL, デフォルト値なしで指定したところエラーになりました。
これに対し,z カラムのデフォルト値を指定するとエラーは発生しなくなります。

CREATE TABLE t (x INT, y INT INVISIBLE, z INT INVISIBLE NOT NULL DEFAULT 4);
INSERT INTO t VALUES (1),(2);
INSERT INTO t (x,y) VALUES (3,33);
ワイルドカードでクエリ実行

Invisible Column を明示的に指定しないでワイルドカードで SELECT 文を実行してみます。

SELECT * FROM t;
+---+
| x |
+---+
| 1 |
| 2 |
| 3 |
+---+

x カラムのみのデータが結果として得られました。

明示的にカラム名を指定し,クエリ実行

これに対して,明示的に各カラム名を指定して SELECT 文を実行しますとすべてのデータが得られます。

SELECT x, y, z FROM t;
+------+------+---+
| x    | y    | z |
+------+------+---+
|    1 | NULL | 4 |
|    2 | NULL | 4 |
|    3 |   33 | 4 |
+------+------+---+
ALTER TABLE で INVISIBLE 属性変更

ここでテーブル t の定義をあらためて確認してみます。

DESC t;
+-------+---------+------+-----+---------+-----------+
| Field | Type    | Null | Key | Default | Extra     |
+-------+---------+------+-----+---------+-----------+
| x     | int(11) | YES  |     | NULL    |           |
| y     | int(11) | YES  |     | NULL    | INVISIBLE |
| z     | int(11) | NO   |     | 4       | INVISIBLE |
+-------+---------+------+-----+---------+-----------+

y, z カラムが INVISIBLE となっています。
ここで,ALTER TABLE で x カラムのみ INVISIBLE とするようテーブル定義を変更します。

ALTER TABLE t MODIFY x INT INVISIBLE, MODIFY y INT, MODIFY z INT NOT NULL DEFAULT 4;

DESC t;
+-------+---------+------+-----+---------+-----------+
| Field | Type    | Null | Key | Default | Extra     |
+-------+---------+------+-----+---------+-----------+
| x     | int(11) | YES  |     | NULL    | INVISIBLE |
| y     | int(11) | YES  |     | NULL    |           |
| z     | int(11) | NO   |     | 4       |           |
+-------+---------+------+-----+---------+-----------+

正常にテーブルを変更することができました。

まとめ

MariaDB Server 10.3 から導入された Invisible Column に関して解説させて頂きました。商用DBでは以前から実装されている機能であり,同様の機能を用いたアプリケーションにおいて,商用DBから MariaDB Server への移行がより容易になるかと考えます。