Условное ограничение со связанными таблицами - PullRequest
0 голосов
/ 01 мая 2020

У меня вопрос, связанный с SQL, точнее с PostgreSQL. В настоящее время я пытаюсь создать некоторые условные ограничения, и мне удалось создать условное ограничение в одной таблице. В приведенном ниже примере я хочу убедиться, что столбец cpf не является нулевым, только когда столбец client_type имеет значение "F".

CREATE TYPE client_type AS ENUM('F', 'J');

CREATE TABLE clients (
  id SERIAL NOT NULL UNIQUE, 
  name varchar(255), 
  client_type client_type NOT NULL, 
  cpf varchar(11), 
  cnpj varchar(14), 
  CHECK (CASE WHEN client_type = 'F' THEN cpf IS NOT NULL END), 
  CHECK (CASE WHEN client_type = 'J' THEN cnpj IS NOT NULL END)
);

Мой вопрос, это можно сделать с помощью связанных таблиц?

Например: у меня есть таблица с именем aditional_info , у которой есть внешний ключ, ссылающийся на таблицу клиентов , и я хочу, чтобы некоторые столбцы aditional_info таблица не может быть нулевой, только если соответствующая строка в таблице клиентов имеет столбец со значением «F».

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

1 Ответ

0 голосов
/ 01 мая 2020

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

Функция берет идентификатор клиента, сохраняет тип клиента в переменную и возвращает его.

CREATE OR REPLACE FUNCTION checkClientType(int) RETURNS varchar as $$
DECLARE
    type varchar;
BEGIN
    SELECT client_type INTO type FROM clients WHERE id = $1;

    RETURN type;
END;
$$ LANGUAGE plpgsql;

Затем я проверяю, равно ли значение, возвращаемое функцией, «J», и если это так, я говорю, что столбец unicipal_registration не может быть пустым.

CREATE TABLE aditional_info (
  id SERIAL NOT NULL UNIQUE,
  client_id int REFERENCES clients(id) ON DELETE SET NULL ON UPDATE CASCADE,
  rg varchar(10) NOT NULL,
  issuing_body varchar NOT NULL,
  birth_date timestamp NOT NULL,
  municipal_registration varchar,
  CONSTRAINT not_null_municipal_registration CHECK(CASE WHEN checkClientType(client_id) = 'J' THEN municipal_registration IS NOT NULL END)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...