私はデータベースに関しては初心者で、SQLite3 のドキュメントを読んでいます。ただし、次の答えが見つかりません。
一部の読み取り専用フィールドを持つ SQLite3 データベース テーブルを作成することはできますか (つまり、テーブル全体が読み取り専用ではない)? 追加のコードを使用してフィールドへの書き込みを停止できることはわかっていますが、制約などを定義できるかどうか疑問に思っていました。
ありがとう!
私はデータベースに関しては初心者で、SQLite3 のドキュメントを読んでいます。ただし、次の答えが見つかりません。
一部の読み取り専用フィールドを持つ SQLite3 データベース テーブルを作成することはできますか (つまり、テーブル全体が読み取り専用ではない)? 追加のコードを使用してフィールドへの書き込みを停止できることはわかっていますが、制約などを定義できるかどうか疑問に思っていました。
ありがとう!
特定の列の更新を防止するトリガーを作成できます。
CREATE TRIGGER ro_columns
BEFORE UPDATE OF col1, col2 ON mytable
BEGIN
SELECT raise(abort, 'don''t do this!');
END
残念ながら、SQLite でテーブルを作成した後に制約を追加することはできません。
列の名前を変更したり、列を削除したり、テーブルから制約を追加または削除したりすることはできません。
つまり、制約を使用して列を読み取り専用にすることはできません。( CHECK
) 制約を使用してテーブルを作成すると、そもそもテーブルに読み取り専用の値を追加できなくなるためです。
これを行う別の方法は、テーブルの名前を変更し、その場所にビューを作成することです。その後、代わりにトリガーを使用INSTEAD OF
してテーブルを更新できます。
readonly
以下は、ゼロ以外に設定すると行が読み取り専用になるフィールドを持つテーブルの例です。
CREATE TABLE test (data TEXT, readonly INTEGER);
がゼロ以外のdata
場合の UPDATE を禁止するトリガーは次のとおりです。readonly
CREATE TRIGGER test_ro BEFORE UPDATE OF data ON test WHEN OLD.readonly != 0
BEGIN
SELECT raise(fail, "Read-only data");
END;