2016-05-09 2 views
1

У меня есть таблица в PostgreSQL 9.4:Ограничение на сумму от строк

user_votes (
    user_id int, 
    portfolio_id int, 
    car_id int 
    vote int 
) 

Можно ли поставить ограничение на стол, так что пользователь может иметь максимум 99 очко голоса, в каждом портфеле? Это означает, что пользователь может иметь несколько строк, состоящих из одних и тех же user_id и portfolio_id, но разных car_id и голосовать. Сумма голосов не должна превышать 99, но она может быть размещена среди разных автомобилей.

Так делают:

INSERT INTO user_vores (user_id, portfolio_id, car_id, vote) VALUES 
    (1, 1, 1, 20), 
    (1, 1, 7, 40), 
    (1, 1, 9, 25) 

бы все разрешено, но при попытке добавить что-то, что превышает 99 голосов должны потерпеть неудачу, как и другой ряд:

INSERT INTO user_vores (user_id, portfolio_id, car_id, vote) VALUES 
    (1, 1, 21, 40) 

ответ

1

К сожалению, нет, если вы пытались создать такой constraint вы увидите следующее сообщение об ошибке:

ERROR: aggregate functions are not allowed in check constraints 

Но замечательное Я расскажу о postgresql о том, что всегда есть несколько способов кожи кошки. Вы можете использовать BEFORE trigger, чтобы проверить, что данные, которые вы пытаетесь вставить, заполняют наши требования.

на уровне строк триггеров вызываются перед может возвратить нуль, чтобы сигнал на спусковом крючке менеджера, чтобы пропустить остальную часть операции для этой строки (то есть, последующих триггера не произвели, и вставки/обновление/DELETE делает не встречаются для этой строки). Если возвращается ненулевое значение, то операция будет продолжена с этим значением строки.

Внутри вашего триггера вы подсчитывать количество голосов

SELECT COUNT(*) into vote_count FROM user_votes WHERE user_id = NEW.user_id 

Теперь, если vote_count 99 вы возвращаете NULL, и данные не будут вставлены.

Смежные вопросы