2012-12-05 2 views
0

내가이 개 테이블이 : 박스가 삭제되거나 업데이트되는 경우이 외래 키 (INNO DB)

id box_name hidden 

--------------------------- 

id item_name box_id hidden 

그래서 외부 키가 box_id입니다, 그것은 또한 하위 항목을 터치,하지만 난 방법을 만들 수 있습니다 숨겨진 필드와 동일하지만, 같은 유형의 int (11) 인덱스입니다. 일부 상자를 숨기면 모든 자식이 숨겨 지지만 box_id -> id, 숨겨진 자식 만 숨기는 방법은 무엇입니까? ??

또는 다른 말로

, 만드는 방법이 외래 키

+0

테이블에 이름을 지정했다면 더 쉽게 질문 할 수 있지만 ... '숨겨진'열의 값을 동기화 상태로 유지 하시겠습니까 ?? –

+0

어떻게 설명해야할지 모르겠다.하지만 모든 항목이 아니라 숨겨진 상자의 모든 항목을 숨기고 싶다. 부모가 숨겨져있는 사람 만 – Zecrow

+0

에, 업데이 트와 동일하지만 어떻게 숨겨진 필드와 동일하게? – Zecrow

답변

1
쉽게 오히려 단지보다는 부모 테이블에 id,hidden 필드를 고유 제한 조건을 추가하고 ( id,hidden)에 FK를 가지고 귀하의 세부 테이블을 변경하여이 작업을 수행 할 수 있습니다

id. 그러나이 경우 항상 부모 hidden과 같기 때문에 hidden 특성을 세부 테이블에 저장해야하는 이유는 알 수 없습니다.

차라리 세부 테이블 [s]의 모든 필요한 행을 업데이트하는 마스터 테이블에 애프터 업데이트 트리거를 추가하고 싶습니다.

업데이트. 예.
1 방식

CREATE TABLE boxTable(id int not null auto_increment primary key,hidden 
tinyint not null, 
... 
CONSTRAINT UQ_BOXTABLE(id,hidden)); 
CREATE TABLE childTable(...., boxId int not null, hidden tinyint not null, 
CONSTRAINT FK_childTable_BoxTable FOREIGN KEY (boxId, hidden) REFERENCES 
boxTable(boxId, hidden) ON DELETE CASCADE ON UPDATE CASCADE) ; 

가 자동 childTable에서 업데이트됩니다 boxTable 당신이 hidden 변경할 때마다.

두번째 방법 첫 번째는하지 않습니다,

CREATE TRIGGER AU_boxTable AFTER UPDATE ON boxTable 
FOR EACH ROW 
BEGIN 
    IF (new.hidden <> old.hidden) THEN 
    update childTable set hidden = new.hidden WHERE boxId = new.id; 
    END IF; 
END; 

두번째 방법은 당신이 boxTable에 관계없이 값의 childTable에서 hidden 필드를 변경 할 수 있습니다 (퍼펙트 구문, 나는 순간에 MySQL의이 없습니다).

+0

itemTable.box_id = boxTable 인 숨겨진 필드를 변경하고 싶습니다. id – Zecrow

+0

숨겨진 필드가 인덱스이므로 고유 제한을 추가 할 수 없습니다. hidden_2, hidden_3 등의 중복 항목 오류가 발생합니다. – Zecrow

+0

상자 중 일부를 숨기면 해당 상자 안의 모든 항목이 숨겨집니다.하지만 지금 상자 중 하나를 숨기면 모든 항목이 속한 상자와 상관없이 숨겨집니다. 그 이유는 무엇입니까? – Zecrow

1

외래 키의 목적을 잘못 이해 한 것 같습니다. 기본적으로 참조 무결성을 강화하도록 설계되었으므로 대상 행이 존재하지 않는 외래 키를 실제로 저장할 수 없습니다. 또한 이러한 무결성을 유지하는 데 도움이되므로 다른 테이블에서 참조되는 행을 제거하려고하면 허용되지 않거나 연속 삭제가 발생합니다.

그러나 외래 키를 사용하여 임의의 계단식 업데이트를 수행 할 방법이 없습니다. 그들은 단순히 그것을 위해 설계되지 않았습니다.

아마 트리거를 생각하고 있습니다 : -?