이 문제는 나에게 진정한 두통을주고있다.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
쿼리에서 트랜잭션을 사용하지만이 결과가 쿼리의 결과에 어떤 영향을 줄지는 알지 못하므로이 예제에 표시되지 않았습니까? (쿼리를 한 단계로 만들어야한다고 가정) – Industrial
@Industrial 트랜잭션을 사용하면 SQL에서 모든 조인을 제거하고 대신 별도의 쿼리 집합을 발행 할 수 있습니다. 복잡성을 제거하고, 실패한 경우 변경 사항을 되돌려 데이터베이스가 일관성을 유지하도록합니다. –