Оценка ограничений Sybase Check - PullRequest
0 голосов
/ 26 марта 2012

Я пытаюсь сформулировать некоторые проверочные ограничения в 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 Ответ

0 голосов
/ 23 мая 2012

Я не совсем понимаю, что вы пытаетесь применить здесь, но основываясь на этой теме справки.

Использование ограничений CHECK для столбцов

Как только условие CHECK выполнено, оцениваются будущие значения против условия перед изменением строки.

Я бы пошел на триггер перед вставкой. У вас есть больше опций, и вы можете получить лучшее сообщение об ошибке.

...