2017-10-16 9 views
0

SQLiteはTRUEとFALSEをサポートしていないため、0と1を格納するbooleanキーワードがあります。カラムに含まれる1の数のチェックが必要で、テーブルの総数が制限されます。カラムの値に基づいてテーブルに含めることができる行の数を制限する - SQLite

たとえば、表には名前、isAdultという列を含めることができます。テーブルに大人が5人以上いる場合、システムはisAdult = 1で6番目のエントリを追加することはできません。テーブルに含めることができる行数に制限はありません。エントリはisAdult = 0です。

答えて

1

あなたは6番目のエントリの挿入を防止するためにトリガーを使用することができます。

CREATE TRIGGER five_adults 
BEFORE INSERT ON MyTable 
WHEN NEW.isAdult 
AND (SELECT COUNT(*) 
     FROM MyTable 
     WHERE isAdult 
    ) >= 5 
BEGIN 
    SELECT RAISE(FAIL, "only five adults allowed"); 
END; 

(。あなたが更新のために同様のトリガーが必要になる場合があります)

+0

はまだそれをテストしたが、それが何をすべきように思えるはありませんかトリック。ありがとう! – modegv

0

SQL-99標準では、ASSERTION(任意のSELECT文に関してデータの変更を検証できるタイプ)を使用してこれを解決します。残念ながら、市場に現在あるSQLデータベースはASSERTIONの制約を実装していません。これはSQL標準のオプション機能であり、実装者はそれを優先順位付けしていません。

回避策は、外部キー制約を作成することです。isAdultは、値1〜5のみを含むルックアップテーブルを参照する整数値にすることができます。次に、UNIQUE制約をisAdultに設定します。大文字でないユーザーの行が "偽"の場合はNULLを使用します(UNIQUEはNULLを無視します)。

もう1つの回避策は、アプリケーションコードでこれを行うことです。あなたの変更があなたのアプリのビジネスルールを壊さないことを確認するために、データベースを変更する前にSELECTを実行してください。通常、マルチユーザのRDMSでは、競合状態では不可能ですが、SQLiteを使用しているので、あなたは唯一のユーザかもしれません。

関連する問題