2010-06-03 2 views
1

이 문제는 나에게 진정한 두통을주고있다.JOIN으로 삭제 하시겠습니까?

저는 데이터베이스에서 "클로저 테이블"이라는 디자인의 도움으로 카테고리 정렬을 해결하는 두 개의 테이블을 가지고 있습니다. 첫 번째 표는 categories이고 다른 표는 categoriesPaths입니다. 그것은 결국 자식 노드, 나는 다음과 같은 쿼리를 실행의와

parent | children | level 
----------------------- 
1  | 1   | 0 
1  | 2   | 1 
2  | 2   | 0 

함께 경로를 삭제하려면 :

id | name 
---------------- 
0 | Category 1 
1 | Category 2 

CategoriesPaths은 다음과 같습니다

카테고리는 단순히 언어 기반 테이블 ($ top은 삭제가 시작될 상위 상위 노드 수준입니다)

DELETE d FROM CategoriesPaths children 
JOIN CategoriesPaths a USING (children) 
WHERE a.parent = $top; 

내가 무엇을 원하니? 할 일은 쿼리를 변경하여 categories 테이블의 대표 경로도 삭제합니다. 불행히도이 작업을 수행하기에 충분한 SQL 지식이 없습니다. 나는 쿼리 전에 foreach 루프로 해결 방법을 만들려고했으나, categories 테이블은 categoriesPaths ... 을 참조하기 때문에 삭제가 실패했다.

누군가가 폐쇄 테이블 디자인에 대한 자세한 내용은하고자하는 경우

가, 여기에 내가에서 배운하는 slideshare에 대한 참조입니다 : http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back

답변

1

은 왜 트랜잭션을 사용합니까? http://www.firstsql.com/tutor5.htm

+0

쿼리에서 트랜잭션을 사용하지만이 결과가 쿼리의 결과에 어떤 영향을 줄지는 알지 못하므로이 예제에 표시되지 않았습니까? (쿼리를 한 단계로 만들어야한다고 가정) – Industrial

+1

@Industrial 트랜잭션을 사용하면 SQL에서 모든 조인을 제거하고 대신 별도의 쿼리 집합을 발행 할 수 있습니다. 복잡성을 제거하고, 실패한 경우 변경 사항을 되돌려 데이터베이스가 일관성을 유지하도록합니다. –

2

글쎄, 난 다른 경로를 취할 것입니다.

  1. 임시 테이블
  2. 드롭 임시 테이블에서 카테고리를 삭제 임시 테이블에서
  3. 삭제 CategoriesPaths을 삭제하는 모든 항목의 id의와 임시 테이블을 생성합니다. 이처럼

:

-- not tested 
CREATE TABLE tmp_to_delete 
AS SELECT children.children 
FROM CategoriesPaths children 
JOIN CategoriesPaths a USING (children) 
WHERE a.parent = $top; 

DELETE FROM CategoriesPaths WHERE children IN (SELECT children FROM tmp_to_delete) 
DELETE FROM Categories WHERE id IN (SELECT children FROM tmp_to_delete) 

DROP TABLE tmp_to_delete 
관련 문제