1

000 から 999 の間で制限された整数の主キーを持つテーブルを作成したいと思います。SQL 内でこの 3 桁の制限を強制する方法はありますか?

私はsqlite3を使用しています。ありがとう。

4

4 に答える 4

2

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また、ユーザーが範囲外の値を変更できないようにするために、トリガーを書き込む必要がある場合もあります。基本的に、CHECKSQLite 3.3 以降を使用する場合は、制約を使用することをお勧めします。

注:上記のコードはテストしていません。

于 2008-10-28T21:44:43.483 に答える
1

jmisso、削除された主キーを再利用することはお勧めしません。そのキーを持つ可能性のある他のすべてのテーブルが最初に削除されていない場合、データ整合性の問題が発生する可能性があります (このような孤立したデータを防ぐために、データベースで常に外部キー関係の設定を強制する理由の 1 つです)。新しいレコードに関連付けられる可能性のある孤立したデータがないことが確実でない限り、これを実行しないでください。

主キーを 1000 の可能な値に制限したいのはなぜですか? テーブルに 1500 レコードが必要な場合はどうなりますか? これは、やろうとしていることでさえ、あまり良いことだとは思えません。

于 2008-10-28T22:01:24.650 に答える
1

CHECK 制約を使用してこれを行うことができる場合があります。

しかし、

CHECK 制約は、バージョン 3.3.0 以降でサポートされています。バージョン 3.3.0 より前では、CHECK 制約は解析されましたが、強制されませんでした。

ここから)

したがって、SQLite 3 = SQLite 3.3 でない限り、これはおそらく機能しません。

于 2008-10-28T21:39:35.317 に答える
0

最初に 1000 行をテーブルに事前入力するのはどうでしょうか。Is_Available などのような 1/0 列で利用可能な行を切り替えます。次に、挿入または削除を許可せず、更新のみを許可します。このシナリオでは、更新のためにアプリをコーディングするだけで済みます。

于 2008-11-04T18:06:17.847 に答える