0

SQL Anywhere 9.0 でチェック制約を作成しようとしています。

基本的に、私は次のようなスキーマを持っています:

CREATE TABLE limits (
    id INT IDENTITY PRIMARY KEY,
    count INT NOT NULL
);

CREATE TABLE sum (
    user INT,
    limit INT,
    my_number INT NOT NULL CHECK(my_number > 0),
    PRIMARY KEY (user, limit)
);

my_number各制限の制約を、テーブル内の最大数になるように強制しようとしています。

私はもう試した

CHECK ((SELECT sum(my_number) FROM sum WHERE limit = limit) <= (SELECT count FROM limits WHERE id = limit))

CHECK (((SELECT sum(my_number) FROM sum WHERE limit = limit) + my_number) <= (SELECT count FROM limits WHERE id = limit))

どちらも正しいことをしていないようです。どちらも 1 ずれています (つまり、負の数を取得すると、挿入は失敗しますが、それ以前ではありません。

私の質問は、これらのサブクエリが実行されているテーブルのバージョンは何ですか? 挿入が発生する前のテーブルですか、それとも、挿入が発生した後にサブクエリが一貫性をチェックし、無効であることが判明した場合はロールバックしますか?

4

1 に答える 1

0

ここで強制しようとしていることはよくわかりませんが、このヘルプ トピックに基づいています。

列に対する CHECK 制約の使用

CHECK 条件が設定されると、行が変更される前に、条件に対して将来の値が評価されます。

挿入前のトリガーを使用します。より多くのオプションがあり、より適切なエラー メッセージを表示できます。

于 2012-05-23T15:52:46.120 に答える