2008-10-22 2 views

답변

22

직선

... the manual에서 우리는 외래 키가 어떤 제품에 관련이없는 주문의 작성을 허용 것을 알고있다. 그러나 제품을 참조하는 주문이 생성 된 후 제품이 제거되면 어떻게됩니까? SQL은이를 처리 할 수 ​​있습니다.

허용 안가 참조 된 제품

뿐만 아니라 다른

뭔가 주문을 삭제 삭제 : 직관적으로, 우리는 몇 가지 옵션이?

CREATE TABLE order_items (
product_no integer REFERENCES products ON DELETE RESTRICT, 
order_id integer REFERENCES orders ON DELETE CASCADE, 
quantity integer, 
PRIMARY KEY (product_no, order_id) 
); 

제한 및 삭제 계단식

은 가장 일반적인 두 가지 옵션이 있습니다. RESTRICT는 참조 된 행의 h 제를 f 지합니다. NO ACTION은 제한 조건이 점검 될 때 참조 행이 여전히 존재하면 오류가 발생 함을의 L합니다. 아무것도 지정하지 않으면 이것이 기본 동작입니다. CASCADE는 참조 된 행이 삭제 될 때이를 참조하는 행을 자동으로 삭제하도록 지정합니다 (이 두 가지 선택의 근본적인 차이점은 NO ACTION이 트랜잭션의 뒷부분까지는 확인을 연기 할 수 있지만 RESTRICT는 그렇지 않음). 게다가. 다른 두 가지 옵션이 있습니다 : SET NULL과 SET DEFAULT. 이로 인해 참조 된 행이 삭제 될 때 참조하는 열이 각각 null 또는 기본값으로 설정됩니다. 이것들은 당신이 어떤 제약 사항을 지키지 못하게한다. 예를 들어, 조치가 SET DEFAULT를 지정하지만 디폴트 값이 외부 키를 충족시키지 않으면 조작이 실패합니다.

ON DELETE와 비슷하게 참조 된 열이 변경 (업데이트) 될 때 호출되는 ON UPDATE도 있습니다. 가능한 조치는 동일합니다.

편집 : 당신이 관련 질문에 대해 살펴 걸릴 수도 있습니다 : When/Why to use Cascading in SQL Server?합니다. 질문/답변 뒤에 나오는 개념은 같습니다.

0

은 내가 PostgreSQL 데이터베이스를 가지고 내가 데이터베이스에서 삭제 사용자가있을 때 나는 삭제에 사용하고 나는 그것이 다른 테이블에서 정보의 삭제해야합니다. 이 방법을 사용하면 하나만 삭제하고 ON 삭제가있는 FK는 다른 테이블에서 정보를 삭제합니다.

ON 업데이트에서도 동일한 작업을 수행 할 수 있습니다. 테이블을 업데이트하고 필드에 업데이트가있는 FK가있는 경우 FK가 변경되면 FK 테이블에 나타납니다. Daok 말이 사실이라면

0

는 ... 오히려 편리 할 수 ​​있습니다. 반면에, 데이터베이스에서 자동으로 문제가 발생하는 것은 실제 문제가 될 수 있습니다. 특히 데이터를 제거하는 경우에 특히 그렇습니다. 앞으로 FK가 자녀가있을 때 FK가 부모를 삭제하지 못하도록하고 On Delete Cascade를 사용하면 삭제가 방지되지 않을뿐만 아니라 수십 개의 계단식 삭제 폭포로 인해 다른 테이블이 사라집니다.

@ 아서의 의견.

더 자주 "숨겨진"일이 사람이 지금 무슨 일이 일어나고 있는지에 대한 좋은 핸들이있을 것이라는 점을하게 데이터베이스 덜 가능성에 발생합니다.트리거 (그리고 이것은 본질적으로 트리거입니다) 내 데이터베이스 전체에 광범위한 결과를 가지고 행을 삭제 내 간단한 조치가 발생할 수 있습니다. Delete 문을 발행하고 17 개의 테이블이 트리거 및 제약 조건의 계단식으로 영향을받으며이 중 아무 것도 명령 발행자에게 즉시 명백하지 않습니다. OTOH, 부모와 그 모든 자식을 프로 시저에 삭제하면 누구나 내가 명령을 내릴 때 일어날 일을 정확히 볼 수 있습니다.

데이터베이스를 디자인하는 것과는 아무런 관련이 없습니다. 그것은 트리거에 의해 도입 된 운영 문제와 관련이 있습니다.

+1

스키마가 올바르게 설계되었다고 생각되지 않는다. 일반적으로 자식 데이터 (FK)는 부모가 없으면 유용하지 않습니다. –

+0

그건 합리적인 진술입니다. 그러나 의도하지 않고 발생하는 더 많은 것들은 데이터베이스의 성공을 저해합니다. 위의 답변에서 수정 사항을 참조하십시오. –

+0

DB가 응용 프로그램의 데이터 덤프인지 아니면 DB 자체에 값/의미가 있는지를 결정해야합니다. DB가 응용 프로그램없이 작동 할 수있는 경우 (직접 데이터로드, 직접 쿼리 액세스 등), DB 계층에 규칙을 정의해야합니다. 응용 프로그램이 해당 작업을 수행 할 수 없기 때문입니다. 내 경험에 비추어 볼 때 주니어 개발자는 DB를 응용 프로그램으로 관리하는 경향이 있지만 수석 개발자 (너무 많은 시간을 지쳤다)는 DB를 자체적으로 설계하도록 설계하는 경향이 있습니다. DB가 앱이 사라진 후에도 오래 살 수 있음을 기억하십시오. 이것은 데이터베이스에 적용된 캡슐화의 원리 일뿐입니다. –

0

모든 작업을 수행하는 방법, 계단식 삭제 또는 계단식 업데이트를 작성하는 대신 경고 메시지를 작성할 수 있습니다. 바퀴를 재발 명하는 것보다 훨씬 쉽고, 클라이언트 (그리고 코드를 집어 들고있는 새로운 개발자)에게 명확하게 해준다.