Чтобы обойти создание внешнего ключа на основе «действительного» условия, вам нужно будет изменить дизайн таблицы и создать триггер для установки product.code = NULL.Извините за синтаксис (я давно не кодировал Sybase), но это общая идея:
Добавить новый столбец, который будет служить первичным ключом, так как нам нужно будет установить product.code = NULL, когдаvalid = 0:
CREATE TABLE product (
rowid int identity primary key,
code char(8) NULL,
CONSTRAINT brand_fk FOREIGN KEY (code) REFERENCES brand(code)
)
Затем создайте триггер, подобный этому:
create trigger FK_WhenValid
on product
for insert
AS
IF (SELECT COUNT(*) FROM brand b inner join inserted i on b.code = i.code AND b.valid=0 ) > 0
BEGIN
UPDATE product SET code = NULL WHERE code in (SELECT i.code from brand b join inserted i on b.code = i.code and b.valid = 0)
END
Примечание: этот триггер поддерживает только вставки продукта.Если «valid» может измениться, требуется другой подход.
Вы также можете реализовать внешний ключ в качестве триггера вместо декларативного ограничения и устанавливать product.code = insert.code только тогда, когда valid = 1