2

私はデータベースに関しては初心者で、SQLite3 のドキュメントを読んでいます。ただし、次の答えが見つかりません。

一部の読み取り専用フィールドを持つ SQLite3 データベース テーブルを作成することはできますか (つまり、テーブル全体が読み取り専用ではない)? 追加のコードを使用してフィールドへの書き込みを停止できることはわかっていますが、制約などを定義できるかどうか疑問に思っていました。

ありがとう!

4

4 に答える 4

11

特定の列の更新を防止するトリガーを作成できます。

CREATE TRIGGER ro_columns
BEFORE UPDATE OF col1, col2 ON mytable
BEGIN
    SELECT raise(abort, 'don''t do this!');
END
于 2012-10-16T10:07:46.113 に答える
2

残念ながら、SQLite でテーブルを作成した後に制約を追加することはできません

列の名前を変更したり、列を削除したり、テーブルから制約を追加または削除したりすることはできません。

つまり、制約を使用して列を読み取り専用にすることはできません。( CHECK) 制約を使用してテーブルを作成すると、そもそもテーブルに読み取り専用の値を追加できなくなるためです。

于 2012-10-16T09:58:55.833 に答える
1

これを行う別の方法は、テーブルの名前を変更し、その場所にビューを作成することです。その後、代わりにトリガーを使用INSTEAD OFしてテーブルを更新できます。

http://www.sqlite.org/lang_createtrigger.htmlを参照してください。

于 2012-10-16T10:17:17.417 に答える
0

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;
于 2020-09-11T23:00:32.280 に答える