Postgres проверяет, есть ли в связанной таблице запись, если поле имеет значение True - PullRequest
0 голосов
/ 12 октября 2018

У меня есть таблица с логическим столбцом automated.Если для этого поля установлено значение TRUE, тогда в другой таблице должна быть запись, относящаяся к этой строке.

Таблица A

     id    |   automated
    ---------------------
     1     |       False
     2     |       True
     3     |       False

Таблица B

     id    |  FK-TableA   |  Value
     -------------------------------
     2     |       2      |   X

Поэтому, когда в таблицу A вставляется новая запись, где automated устанавливается на TRUE, тогдатакже должна быть строка, вставленная (или присутствующая) в таблице B со ссылкой на нее.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Мне кажется это неестественным потоком, поскольку вы заявляете, что естественный поток должен создавать TRIGGER для таблицы B, которая вставляет запись в таблицу A всякий раз, когда вставляется новая запись таблицы B.

Но я понимаю, что это упрощение более сложной проблемы, поэтому, если вам действительно нужно создать такую ​​процедуру, остается вопрос, на который нужно ответить, что произойдет, если проверка отрицательна, должно ли быть исключение?должна ли запись быть вставлена ​​с FALSE вместо TRUE, должна ли запись игнорироваться?с моей точки зрения, есть два варианта:

  1. Создать TRIGGER до INSERT в таблице A, которая соответствующим образом обновляет таблицу (Создать PROCEDURE, который проверяет, существует ли он, и TRIGGER, который выполняет эту процедуру)
  2. Создать RULE на вставке в вашей таблице A, которая проверяет, существует ли запись в таблице B и изменяет запись или ничего не делает.

Снемного больше предыстории, я могу помочь вам с Trigger / Rule.

В любом случае, учтите, что это может быть реальная ошибка с точки зрения производительности, если эта таблица получает много INSERT, и вы должны пойти на некоторые офлайн (а невыполняется в режиме реального времени INSERT), а не в режиме реального времени INSERT

0 голосов
/ 12 октября 2018

Это ужасно и вносит избыточность в базу данных, но я не могу придумать лучшего способа, чем этот:

  • Введите новый столбец b_id - a.

  • Добавить ограничение UNIQUE на ("FK-TableA", id) к b.

  • Добавить внешний ключ на a, чтобы (id, b_id) REFERENCES b("FK-TableA", id).

  • Добавьте ограничение CHECK (b_id IS NOT NULL OR NOT automated) на a.

Затем необходимо указать b_id на одну из строкв b, который указывает на эту строку a.

Чтобы сделать его идеальным, вам нужно добавить триггеры, которые гарантируют, что после каждой модификации два внешних ключа будут по-прежнему согласованными.

Я же говорил, это было ужасно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...