Ограничение внешнего ключа (references
) может ссылаться только на таблицу (или, более конкретно, на столбцы в первичном или уникальном ключе таблицы). Вы не можете использовать его для ссылки на выбор.
Если вы хотите это сделать, вам нужно использовать ограничение CHECK
, но это ограничение будет проверяться только при вставке и обновлениях: это не так. не допускать, чтобы другие изменения (например, в таблицы в вашем выборе) сделали ограничение недействительным, пока данные находятся в состоянии покоя. Это означает, что во время вставки значение могло соответствовать ограничению, но ограничение могло - незамеченным! - стать инвалидом. Вы заметите это только при обновлении строки.
Примером CHECK
-ограничения может быть:
CREATE TABLE T2 (
ID2 varchar(255) check (exists(
SELECT ID FROM BaseTypes WHERE BaseTypes.ID = ID2
UNION
SELECT ID FROM Types WHERE Types.ID = ID2))
)
Рабочий пример см. this fiddle .
В качестве альтернативы, если ваша цель состоит в том, чтобы «объединить» две таблицы, определите «супер-таблицу», которая содержит первичные ключи обеих таблиц, и обратитесь к этой таблице из ограничения внешнего ключа. Вы можете заполнять и обновлять (например, вставлять и удалять) эту таблицу с помощью триггеров. Или вы можете использовать одну таблицу и заменить существующие представления обновляемым представлением (если это возможно, зависит от точных данных, например, идентификаторы не должны перекрываться).
Это более сложно, но даст Вы получаете преимущество, заключающееся в том, что внешний ключ также принудительно находится в состоянии покоя.