Ну расскажи тогда как проверять энтот ключ при удалении мастер-записи

Я это представляю в виде системных триггеров:

1) При создании ключа на каждый вариант WHEN создаются почти такие же триггеры, как щас на обычные ВК, только во все проверки добавляется условие, прописанное в WHEN

2) При удалении MASTER-записи грохаются все дочерние записи, в которых значения ключевых полей совпадают + выполняется условие.


Ну например создал я ключ типа как я в примере написал:

ALTER TABLE "Child"
ADD CONSTRAINT "Child_fk"
FOREIGN KEY ("ParentId")
REFERENCES
  WHEN "ParentTypeId" = 1 THEN
    "Parent1" ("Id") ON DELETE NO ACTION ON UPDATE NO ACTION
  WHEN "ParentTypeId" = 2 THEN
    "Parent2" ("Id") ON DELETE NO ACTION ON UPDATE NO ACTION


При вставке и обновлении тут яснее некуда. Сначала вычисляет по "ParentTypeId" в какой таблице искать MASTER-запись, а потом делает стандартную проверку как и щас.

При удалении записи из "Parent2" должно выполниться что-то типа:

DELETE FROM "Child" WHERE "ParentTypeId" = 2 AND "ParentId" = OLD."Id";


Я тут вижу проблему в случае если в условии WHEN будет подзапрос или какое-то дурацкое условие типа там сегодняшний день - чётный. Но ты ведь лично делал индексы по выражениям и эта проблема там тоже стоит, но ты её оставил на откуп программисту. Я думаю здесь можно поступить так же... Или разрешить в условии использовать только имена полей и литералы.

Ответить