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))

他们似乎都没有做正确的事情。它们都相差一个(意味着一旦你得到一个负数,那么插入就会失败,但在那之前不会。

所以我的问题是,这些子查询是针对什么版本的表执行的?是插入发生之前的表,还是插入发生后子查询检查一致性,如果发现无效则回滚?

4

1 回答 1

0

我真的不明白你在这里试图强制执行什么,而是基于这个帮助主题。

对列使用 CHECK 约束

一旦 CHECK 条件到位,在修改行之前将根据条件评估未来值。

我会选择插入前触发器。您有更多选择,并且可以显示更好的错误消息。

于 2012-05-23T15:52:46.120 回答