我正在尝试在 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))
他们似乎都没有做正确的事情。它们都相差一个(意味着一旦你得到一个负数,那么插入就会失败,但在那之前不会。
所以我的问题是,这些子查询是针对什么版本的表执行的?是插入发生之前的表,还是插入发生后子查询检查一致性,如果发现无效则回滚?