2012-03-19 4 views
0

VCID는 클라이언트 ID입니다. VCID는 클라이언트 ID입니다. 클라이언트 (CID, 이름, 성) 및 방문수 (VID, VCID, dateOfVisit)와 관련된 두 개의 관련 테이블이 있습니다. 외래 키를 조작하는 방법, 클라이언트가 마지막 방문을 삭제할 때 데이터베이스를 삭제하여 일부 클라이언트에 대한 상대 레코드를 삭제하고 삭제하려면 클라이언트를 삭제하려면 어떻게해야합니까?외래 키로 어려운 작업

+1

* '... 삭제 클라이언트, 해당 클라이언트의 마지막 방문을 삭제하면'* - 그리고 처음 방문했을 때 실수로 최근에 클라이언트를 추가하고, 다시 삭제하기 위해 그것을 삭제하고, - whoops! - "고객은 어디 있니?" –

답변

1

나는 부드러운 삭제를 제안하므로 방문 기록을 유지할 수 있습니다.

소프트 삭제는 추가 필드 is_active을 true로 설정한다는 것을 의미하며, 레코드를 삭제하면 false로 바꿉니다.

1

"on delete delete cascade"를 사용하면 삭제 된 클라이언트의 방문을 자동으로 삭제할 수 있습니다. 예 :

create table clients (id integer primary key);         
create table visits (id integer primary key, 
        client integer, 
        foreign key (client) references clients(id) 
         on delete cascade); 

다른 방법 (방문이없는 클라이언트 자동 삭제)은 더 어렵습니다.

수동으로 실행하여 어떤 방문과 클라이언트를 삭제할 수 있습니다

delete from clients where id in 
    (select cid from 
    (select clients.id as cid, visits.id as vid 
     from clients left join visits on (clients.id = visits.client)) 
    where vid is null);      

(어쩌면 간단 뭔가있다?). 그래서 매번 실행하고, 무언가가 방문에서 삭제 될 때 실행되는 트리거를 생성하십시오 (트리거를 추가하려고하면 삭제 정보를 사용하여 더 똑똑한 작업을 수행 할 수는 있지만).

또는 어쩌면 나보다 더 많은 시간/에너지를 가진 사람이 방아쇠로 답을 쓸 수 있습니다 ...?

(다른 사람들이 말했듯이 자동으로 클라이언트를 삭제하는 것은 상당히 과격한 행동입니다. 일반적으로 프로덕션 시스템에서 수행하고자하는 작업이 아닙니다. 고객이 더 많은 방문을 필요로하는 경우를 제외하고는 상당히 괴롭습니다. 다시 세부 사항을 입력해야하는 경우 ...)

관련 문제