Я пытаюсь сформулировать некоторые проверочные ограничения в 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))
и они оба, кажется, не делают правильную вещь. Они оба отключены на единицу (то есть, если вы получите отрицательное число, вставка завершится неудачно, но не раньше).
Итак, мой вопрос: с какой версией таблицы выполняются эти подзапросы? Это таблица перед вставкой или подзапрос проверяет согласованность после вставки и выполняет откат, если обнаруживает, что она недействительна?