Простой вопрос об ограничении SQL - PullRequest
3 голосов
/ 23 мая 2011

Я не могу опередить то, что я считаю простым ограничением SQL. Допустим, у меня есть следующая таблица:

create table event(
    eventID    serial PRIMARY KEY,
    eventDate  date,
    start      time,
    end        time
);

И я хочу ограничение, которое говорит, что любые два события не могут перекрываться; то есть, если два события происходят в один и тот же день, время начала одного должно быть позже времени окончания другого, или наоборот.

В логике высказываний я бы что-то вроде

FORALL e1,e2 in Events, e1.date = e2.date IMPLIES  (e1.start > e2.end OR e2.start > e1.end)

т.е. почти тривиально Я довольно новичок в SQL, и я просто не понимаю, как сделать то же самое! Есть указатели?

Спасибо Том

Ответы [ 3 ]

1 голос
/ 23 мая 2011

Вам потребуется использовать триггер, который проверяет при каждой вставке или обновлении, совпадает ли новое событие с той же датой / временем, что и предыдущее.

См. Документацию PostgreSQL для триггеров здесь .

CREATE TRIGGER Trigger_check_overlap
BEFORE INSERT OR UPDATE ON event
FOR EACH ROW
EXECUTE PROCEDURE check_overlap();

Здесь - документация для процедур триггера, обратите внимание на специальную переменную NEW, которая позволяет выделять вставляемый элемент. Таким образом, вы можете сравнить NEW.date с датами, уже указанными в таблице.

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

Прежде всего, вы хотите перейти к этому сообщению, которое объясняет, как оптимизировать этот тип запроса:

Интервал сопоставления PostgreSQL между временем начала и окончания по временной метке

После того, как вы добавили столбец поля, вы хотите добавить ограничение exclude (которое автоматически добавит индекс):

exclude (datetime_box with &&) using gist

http://www.postgresql.org/docs/current/static/sql-createtable.html

Также вЕсли вы не знаете, будьте осторожны с хранением часовых поясов:

http://derickrethans.nl/storing-date-time-in-database.html

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

сделайте небольшой поиск по SQL триггерам, они похожи на события, которые происходят, когда вы пытаетесь добавить, обновить или удалить запись из вашей таблицы.там вы можете написать свой скрипт для проверки ваших ограничений.

Счастливого кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...