000 から 999 の間で制限された整数の主キーを持つテーブルを作成したいと思います。SQL 内でこの 3 桁の制限を強制する方法はありますか?
私はsqlite3を使用しています。ありがとう。
SQLite は、これを行う 2 つの方法をサポートしています。
CHECK
主キー列に制約を定義します。
CREATE TABLE mytable (
mytable_id INT PRIMARY KEY CHECK (mytable_id BETWEEN 0 and 999)
);
INSERT
いずれかを中止するトリガー、またはUPDATE
主キー列を不要な値に設定しようとするトリガーをテーブルに作成します。
CREATE TRIGGER mytable_pk_enforcement
BEFORE INSERT ON mytable
FOR EACH ROW
WHEN mytable_id NOT BETWEEN 0 AND 999
BEGIN
RAISE(ABORT, 'primary key out of range');
END
上記のように、自動割り当てされた主キーを使用する場合は、AFTER INSERT
挿入前ではなくトリガーを実行する必要がある場合があります。BEFORE
トリガーの実行時には、主キーの値がまだ生成されていない可能性があります。
UPDATE
また、ユーザーが範囲外の値を変更できないようにするために、トリガーを書き込む必要がある場合もあります。基本的に、CHECK
SQLite 3.3 以降を使用する場合は、制約を使用することをお勧めします。
注:上記のコードはテストしていません。
jmisso、削除された主キーを再利用することはお勧めしません。そのキーを持つ可能性のある他のすべてのテーブルが最初に削除されていない場合、データ整合性の問題が発生する可能性があります (このような孤立したデータを防ぐために、データベースで常に外部キー関係の設定を強制する理由の 1 つです)。新しいレコードに関連付けられる可能性のある孤立したデータがないことが確実でない限り、これを実行しないでください。
主キーを 1000 の可能な値に制限したいのはなぜですか? テーブルに 1500 レコードが必要な場合はどうなりますか? これは、やろうとしていることでさえ、あまり良いことだとは思えません。
CHECK 制約を使用してこれを行うことができる場合があります。
しかし、
CHECK 制約は、バージョン 3.3.0 以降でサポートされています。バージョン 3.3.0 より前では、CHECK 制約は解析されましたが、強制されませんでした。
(ここから)
したがって、SQLite 3 = SQLite 3.3 でない限り、これはおそらく機能しません。
最初に 1000 行をテーブルに事前入力するのはどうでしょうか。Is_Available などのような 1/0 列で利用可能な行を切り替えます。次に、挿入または削除を許可せず、更新のみを許可します。このシナリオでは、更新のためにアプリをコーディングするだけで済みます。