2012-03-26 2 views
0

Я пытаюсь сформулировать некоторые контрольные ограничения в SQL Anywhere 9.0.Sybase Check Constraint Evaluation

В принципе у меня есть схема, как это:

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

, и они оба, кажется, не делать правильные вещи.

Итак, мой вопрос: с какой версией таблицы выполняются эти подзапросы? таблица перед вставкой или проверка подзапроса на согласованность после вставки происходит и откатывается, если она признана недействительной?

ответ

0

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

Using CHECK constraints on columns

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

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