Как проверить, существует ли в таблице только одна комбинация для значения данного столбца - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть таблица, которая имеет 3 столбца child, parent & Grandparent. Дочерний столбец является первичным ключом. Несколько детей могут отчитываться перед одним и тем же родителем.

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

Но для некоторых записей значения Grand Parent отличаются, что является проблемой, и я хотел бы добавить ограничение или что-то подобное, чтобы этого не происходило.

Например, мой стол выглядит ниже

Child | Parent | GrandParent |
10001 | 101    | 700         |
10002 | 101    | 700         |
10003 | 101    | 701         |
10004 | 101    | 700         |

4-й дочерний элемент 10003 сообщает родительскому элементу 101, но grandParent отличается от этого, и я хочу, чтобы этого не произошло.

Обычное ограничение уникального ключа для комбинации Parent / GrandParent не будет работать, поскольку эти два столбца могут иметь повторяющиеся значения. Я не могу добавить ограничение для трех столбцов, потому что это не помешает тому, чтобы вышеописанное произошло.

Не могли бы вы дать мне знать, как этого добиться? Я использую Oracle 12c.

1 Ответ

0 голосов
/ 05 сентября 2018

Вариант 1.

Как сказано в комментариях, колонка деда не нужна. Отношение родитель - дед - это то же самое отношение, что и ребенок - родитель.

Как:

select a.child, a.parent, b.parent 
from parentchild a
,    parentchild b 
where b.child = a.parent

Вариант 2.

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

Пример кода для триггера:

create trigger parentchild_iu
before insert or update
on parentchild for each row
declare
v_count number;
begin
   select count(*) into v_count
   from   parentchild p
   where  p.parent = :new.parent
   and    p.grandparent != :new.grandparent;

   if v_count != 0 then
      raise_application_error("Parent/Grandparent combination invalid.");
   end if;
end;

Вариант 3.

И, как третий вариант, вы можете разделить таблицу на две таблицы: childparent и parentgranparent и получить следующий запрос:

select a.child, a.parent, b.grandparent
from   childparent a
,      parentgrandparent b
where  a.parent = b.parent;

И в обеих таблицах определяют уникальные ключи для обоих столбцов.

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