НА АКТУАЛИЗАЦИЯ CASCADE без външен ключ в postgresql

Имам някои таблици, които трябва да актуализирам каскадно в postgresql, но не мисля, че мога да използвам външни ключове, за да го направя.

Простата версия е, че имам 4 таблици с обекти и 2 таблици за обвързване:

Table X    Table A       Table A-B      Table B      Table B-C    Table C
-------    --------      ---------      -------      ---------    -------
x_id         a_id           x_id          b_id          x_id        c_id
...          ...            a_id          ...           b_id        ...
...          ...            b_id          ...           c_id        ...
                            ...                         ...

В моите обвързващи таблици имам PK за всички id полета (x_id, a_id, b_id), (x_id, b_id, c_id).

Ако актуализирам b_id в таблица A-B, искам да актуализира b_id в таблица B-C, където x_id съвпада.

Ако се опитам да създам ограничение за външен ключ, то ми казва

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

Разбирам, че не прави това, защото (x_id,b_id) не е уникално ограничение, но не може да бъде, защото ще имам множество c_id със същите b_id и x_id.

Надяваме се, че това има смисъл.

Единственият начин да направите това с тригери ли е?


person Phil Freeman    schedule 25.10.2012    source източник


Отговори (1)


Разбирам, че не прави това, защото (x_id,b_id) не е уникално ограничение, но не може да бъде, защото ще имам множество c_id със същите b_id и x_id.

За да имате актуализация на b_id в таблица A-B каскада към таблица B-C, трябва

  • уникално ограничение за някакъв набор от колони, който включва Table_A-C.b_id,
  • същият набор от колони в Table_B-C и
  • препратка към външен ключ в Table_B-C, препращаща към същия набор от колони в Table_A-C, с ON UPDATE CASCADE.

Не ми е ясно дали това е възможно с настоящата ви структура.

If

  • Table_A-B.x_id е автоматично увеличаващо се цяло число, то е уникално само по себе си, тогава
  • в Table_A-B наборът от колони {x_id, b_id} също ще бъде уникален и
  • в Table_B-C колоната x_id е цяло число (или bigint), тогава
  • в Table_B-C наборът от колони {x_id, b_id} може да има препратка към външен ключ към Table_A-C.
person Mike Sherrill 'Cat Recall'    schedule 25.10.2012