2012-10-25 2 views
1

postgresql에서 캐스케이드 업데이트가 필요한 테이블이 있습니다.하지만 외래 키를 사용할 수 있다고 생각하지 않습니다.postgresql에 외래 키가없는 캐스케이드 업데이트

간단한 버전은 내가 4 개 개체 테이블과 2 동점 표가 있습니다 : 나는 모든 ID 필드에서 PK를 내 묶는 테이블에

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  ... 
          ...       ... 

을 (x_id, A_ID, b_id), (x_id, b_id, c_id).

표 A-B의 b_id를 업데이트하면 x_id가 일치하는 표 B-C의 b_id를 업데이트하려고합니다. 내가 외래 키 제약 조건을 만들려고하면

, 그것은 나에게 말한다

"참조 테이블에 주어진 키와 일치하는 고유 제한 조건은 없다 ..."

내가이 일을 아니에요 이해하는 (때문에 x_id, b_id)는 고유 한 제약 조건이 아니지만 같은 b_id 및 x_id를 가진 여러 c_id를 가지므로 존재하지 않을 수 있습니다.

바라건대 말이 되네.

트리거로이를 수행하는 유일한 방법은 무엇입니까?

답변

1

는 나는 (x_id는 b_id)는 고유 제한하지 않기 때문에 것을하고 아니에요 이해하지만 여러 C_ID의 같은 b_id 및 x_id와있을 겁니다 있기 때문에, 할 수 없습니다.

표 BC 표 AB 캐스케이드에서 b_id하는 업데이트를하기 위해

, 당신은

  • Table_A-C.b_id를 포함하는 컬럼의 일부 세트에 고유 제한 조건,
  • 을 필요로하는 Table_B-C의 동일한 열 집합과
  • Table_B-C의 외래 키 참조는 Table_A-C의 동일한 열 집합을 참조하고 ON UPDATE CASCADE를 사용합니다.

현재 구조에서 가능한지 여부는 확실하지 않습니다.

  • Table_A-B.x_id는 autoincrementing 정수이면

    그것은 열

  • Table_A-B에서
  • , 세트 {x_id, b_id}도 독특한 것이다 후 자체로 고유이고
  • Table_B-C에서
  • 는 열 x_id는 Table_A-C에 대한 외부 키 참조를 가질 수 열 {x_id, b_id}의 세트 Table_B-C에서 다음
  • 정수 (또는 BIGINT)이다.
관련 문제