MariaDBの非表示カラム
以前、MySQLやMariaDBに全文検索設定した際に知ったのですが、MySQLやMariaDBで非表示カラム(Invisible Column)という機能が利用できるようになったようです。
全文検索用の非表示カラムは特殊なものだったのですが、ここでは通常の非表示カラムについての利用ケースや使用例を紹介したいと思います。
利用ケース
この機能は主にプログラムの互換性を保つものです。
たとえば、次のようなテーブルがあるとします。
テーブル定義
invisible_test(data_seq,value1)このテーブルにデータを登録するプログラムコードは次のように記述されています。
プログラムコード
...
INSERT INTO invisible_test VALUES(0,1)
...
この状態でテーブル構造を変更すると、
テーブル変更
ALTER TABLE invisible_test ADD value2 INT DEFAULT 0;当然、プログラムコードを修正しない場合は、INSERT時にエラーとなります。
しかしINVISIBLE COLUMN(非表示カラム)を使うとコードを修正しなくても、このような修正時のエラーを回避することができます。なので、プログラム側の修正リリースを提供するまでの一時策として用います。
INVISIBLEでカラムを定義
非表示カラムは、MySQLではバージョン8.0.23から、MariaDBではバージョン10.3から利用可能です。
通常のCREATEやALTER文内で、「 INVISIBLE 」というキーワードを設定することで非表示カラムを作成できます。
非表示カラムを追加
ALTER TABLE invisible_test ADD value2 INT INVISIBLE NOT NULL DEFAULT 0;INVISIBLEカラム設定時にNOT NULL制約を入れる場合は、デフォルト値の設定が必須です。
それぞれの公式ドキュメントのアドレスを紹介しておきます。
挙動確認
INBISIBLEカラムにすると次のプログラムコードは通過できるようになります。新しいカラムには設定したデフォルト値が入ります。
...
INSERT INTO invisible_test VALUES(0,1)
...
「 SELECT * 」文では新規追加したカラムは出力されません。しかし、明示して指定すれば結果として戻ります。
...
SELECT * FROM invisible_test;
...
| data_seq | value1 |
...
SELECT *, value2 FROM invisible_test;
| data_seq | value1 | value2 |
...
また、非表示カラムをふたつ以上持つことはできますが、その際のコーディングの選択肢としては非表示カラムをすべて対象にするかすべて対象にしないかの二択になります。
たとえば次のようなテーブル構造になっていて、value2,value3にINVISIBLEが設定してあるとします。
非表示カラムがふたつあるテーブル構造
invisible_test(data_seq,value1,value2,value3)この時次のふたつのSQLは成立しますが、
INSESRT INTO invisible_test VALUES(0,1);
INSESRT INTO invisible_test VALUES(0,1,2,3);
次のように、非表示カラムの一部だけを設定しただけの場合はエラーとなります。
INSESRT INTO invisible_test VALUES(0,1,2);
ドライバの実装にもよるかもしれませんが、筆者の使っていたODBCドライバでは挿入対象のカラムを指定せずに、プレースホルダを利用してVALUES(?,...)とした際は非表示カラムを対象にはできませんでした。
/* これだと実行時にエラーになりました */
INSESRT INTO invisible_test VALUES(?,?,?,?);
/* こちらなら通りました */
INSESRT INTO invisible_test(data_seq,value1,value2,value3) VALUES(?,?,?,?);