2017-01-26 7 views
0

У меня есть «фильмы» стол, и мне нужно добавить ограничение в том, что «Стивен Спилберг» фильмы должны быть до 1990 года и фильмы «Джеймс Кэмерон» должны быть после 1990 годаMulti-колонки проверочных ограничений

Я новичок в Oracle SQL. Я попробовал несколько запросов, но они не сработали. Что-то вроде

alter table movie_16bce1346 add constraint chk_spk 
       if director='Steven Spielberg' then check (year>1990); 

Каков правильный способ написать это ограничение?

+0

В чем вопрос? – Jonathan

+0

Как способ политики, я бы не сделал правило, подобное этому ограничению. Я бы создал отдельную таблицу этих ограничений и применял ее с помощью процедур обновления/вставки или триггера update/insert. Это обеспечило бы большую гибкость при добавлении дополнительных фильмов и/или в качестве ограничений, требующих модификации. –

ответ

0

Вы можете use a CASE statement в проверочном ограничении:

ALTER TABLE movie_16bce1346 
ADD CONSTRAINT check_year CHECK 
    (CASE 
    WHEN director = 'Steven Spielberg' AND movie_year > 1990 THEN 1 
    WHEN director = 'James Cameron' AND movie_year < 1990 THEN 1 
    WHEN director NOT IN ('Steven Spielberg', 'James Cameron') THEN 1 
    ELSE 0 END = 1); 

КОРПУС улавливает ваши условия, которые необходимо возвращать 1 или 0. «END = 1» говорите, что результат МИОНом должен равен 1.

+0

Это отклонит любой фильм с режиссером *, кроме * Спилберга или Кэмерона. – mathguy

+0

Хорошая точка! Я обновил ограничение, чтобы удовлетворить это. – bbrumm

1

ограничение должно быть что-то вроде этого:

(director not in ('Steven Spielberg', 'James Cameron') or 
    director is null /* if that is allowed */   or 
    director = 'Steven Spielberg' and movie_year < 1990 or 
    director = 'James Cameron' and movie_year > 1990  ) 

Вы можете использовать круглые скобки вокруг и разделенные условий в строках 3 и 4, если у ou не доверяйте вашим разработчикам быть очень знакомыми и удобными с приоритетом AND и OR.

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

  • Нет связанных вопросов^_^