Подзапрос в ограничении кортежа DB2

В моем курсе по базам данных мы используем книгу (система баз данных - полная книга), в которой говорится, что следующее является допустимым оператором создания таблицы в стандартном 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 не позволит мне. (Я знаю, что есть много других вещей, которые нужно ограничить для эмуляции внешнего ключа)


person Lasse Espeholt    schedule 08.09.2010    source источник
comment
Пожалуйста, опубликуйте настоящий DDL. В вашем обновлении № 2 показана таблица, в которой вы хотите проверить, что идентификатор встречи уже существует в той же таблице, прежде чем вставлять его? Как вставить первую строку? ;-)   -  person Ian Bjorhovde    schedule 10.09.2010
comment
С INTEGRITY OFF :) Я просто хочу знать, есть ли хорошая альтернатива ограничениям строк, когда мне приходится использовать подзапросы. Реальный пример длинный и глупый (руководство с плохо спроектированной базой данных), поэтому я думаю, что лучше его не использовать. Но я объясню более подробно, что я хочу (см. обновление 3 через 2 секунды)   -  person Lasse Espeholt    schedule 10.09.2010


Ответы (2)


ALL() не является стандартным SQL** — это расширение T-SQL. DB2 не поддерживает это.

Я не уверен, что вы пытаетесь сделать со своим ограничением - похоже, вы пытаетесь убедиться, что каждое значение num в таблице Numbers меньше или равно 1. Если это действительно так, вы следует добавить ограничение для таблицы Numbers, а не для участников.

**стандарт SQL92, и я не думаю, что он был добавлен в SQL99 или SQL2003

person Ian Bjorhovde    schedule 08.09.2010

Как реализовать необязательное (или альтернативное) ограничение проверки внешнего ключа в SQL Server

create function dbo.meetidinmeetings(@meetid)
returns bit
as
begin
declare @return bit
as
if exists(select 1 from meetings where meetid = @meetid)
set @return =1 
else
set @return = 0
return @return
end

потом...

CREATE TABLE Foo (
meetid INT NOT NULL,
ismeeting bit NOT NULL DEFAULT 0

ALTER TABLE FOO
ADD CONSTRAINT CHK_FOO_MEETID
CHECK ((ismeeting = 0) or (ismeeting = 1 and dbo.is_meetidinmeetings(meetid) = 1)))
person Fred10538    schedule 08.12.2010