SQL. Как проверить, содержит ли вставленные данные значение правильной группы из другой таблицы? - PullRequest
0 голосов
/ 05 февраля 2020

Если есть две общие словарные таблицы. Один состоит из категорий, а другой состоит из элементов категорий. Также у меня есть таблица c, которая должна быть связана с одним из элементов категорий соответствующей категории. Вот пример:

Таблица категорий

id | title
-------------------
0  | payment type
1  | vehicle type

Таблица элементов категорий

id | title      | category_id
-----------------------------
0  | hourly     | 0
1  | full time  | 0
2  | motorcycle | 1
3  | bus        | 1

Таблица сотрудников

id | name | payment_type 
------------------------
0  | Mike | 1
1  | Josh | 0
2  | Anna | 1

Так что мне нужно Таблица сотрудников * Столбец 1019 * payment_type может иметь только эти идентификаторы из Категории элементов таблица, которая относится к тип оплаты из Категории таблица

Как я могу сделать это в Postgres? И как я могу сделать это с помощью typeorm, если это возможно?

1 Ответ

0 голосов
/ 05 февраля 2020

Простых ограничений недостаточно для этого условия. Я думаю, вам придется использовать function и trigger. Взгляните на следующую статью: когда-проверки-недостаточно-*-1016 * -триггеры-для-целостности данных

Я изменил пример и приготовил следующий.

  CREATE FUNCTION validate_payment_type() returns trigger as $$
      DECLARE
        categoryid int;
      BEGIN
         categoryid := (select id from categories c inner join categories_items ci on c.id = c.category_id
         where NEW.payment_type = c.id);

        -- categoryid with zero is payment
        IF (categoryid != 0) THEN
          RAISE EXCEPTION 'Attempting to insert payment_type that has a category item that is not payment_type';
        END IF;
        RETURN NEW;
      END;
      $$ language plpgsql;

      CREATE TRIGGER validate_payment_type  BEFORE INSERT OR UPDATE ON Employees
      FOR EACH ROW EXECUTE PROCEDURE validate_payment_type();

Примечание. Я не проверял его на действующей базе данных, поэтому возможны некоторые опечатки. Примечание2: Вы можете перейти с categoryId на categoryTitle, но вам потребуется немного изменить запрос и использовать вместо него varchar, если int.

...