В моем курсе по базам данных мы используем книгу (система баз данных - полная книга), в которой говорится, что следующее является допустимым оператором создания таблицы в стандартном SQL:
CREATE TABLE Participants (
meetid INT NOT NULL,
-- ...
CONSTRAINT RoomConstraint
CHECK (1 >= ALL (SELECT num FROM Numbers)
);
Но DB2 жалуется и дает 20 возможных объяснений того, почему этот оператор не работает.
Итак, разве DB2 не поддерживает подзапросы в кортежных ограничениях? И если нет, то является ли TRIGGER единственным решением для обеспечения соблюдения ограничения подзапроса?
Обновление: я нашел эту ссылку, в которой говорится, что это невозможно: http://bytes.com/topic/db2/answers/837390-can-constraint-replace-триггер
Но опять же, является ли ТРИГГЕР единственным выходом? (Я пытаюсь установить связь, в которой атрибут может ссылаться на две разные таблицы (это не моя база данных))
Обновление 2: без ALL
тоже не работает:
CREATE TABLE Foo (
meetid INT NOT NULL,
CHECK (meetid IN (SELECT meetid FROM Foo)));
Обновление 3: идея в том, что мне нужен внешний ключ, который ссылается на две таблицы, например:
Table Participants (pid, ...)
Table Rooms (room, ...)
Table People (userid, ...)
По сути, pid должен существовать либо в Rooms (атрибут room), либо в People (атрибут userid). Я мог бы внести часть этого с ограничением строки, которое проверяет, находится ли pid в комнатах или в людях, но DB2 не позволит мне. (Я знаю, что есть много других вещей, которые нужно ограничить для эмуляции внешнего ключа)