Создайте таблицу с внешним ключом, ссылающимся на временную таблицу, созданную запросом - PullRequest
0 голосов
/ 17 июня 2020

Мне нужно создать таблицу с полем, которое является внешним ключом, ссылающимся на другой запрос, а не на существующую таблицу. Например, следующий оператор верен:

CREATE TABLE T1 (ID1 varchar(255) references Types)

, но этот выдает синтаксическую ошибку:

CREATE TABLE T2 (ID2 varchar(255) references SELECT ID FROM BaseTypes UNION SELECT ID FROM Types)

Я не могу понять, как Я могу достичь своей цели. В случае, если необходимо ввести временную таблицу, как я могу заставить эту таблицу обновляться каждый раз при изменении таблиц BaseTypes и Types?

Я использую Firebird DB и инструмент управления IBExpert.

1 Ответ

2 голосов
/ 18 июня 2020

Ограничение внешнего ключа (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 .

В качестве альтернативы, если ваша цель состоит в том, чтобы «объединить» две таблицы, определите «супер-таблицу», которая содержит первичные ключи обеих таблиц, и обратитесь к этой таблице из ограничения внешнего ключа. Вы можете заполнять и обновлять (например, вставлять и удалять) эту таблицу с помощью триггеров. Или вы можете использовать одну таблицу и заменить существующие представления обновляемым представлением (если это возможно, зависит от точных данных, например, идентификаторы не должны перекрываться).

Это более сложно, но даст Вы получаете преимущество, заключающееся в том, что внешний ключ также принудительно находится в состоянии покоя.

...