내 테이블을 작성하는 스크립트는 다음과 같습니다.
CREATE TABLE clients (
client_i INT(11),
PRIMARY KEY (client_id)
);
CREATE TABLE projects (
project_id INT(11) UNSIGNED,
client_id INT(11) UNSIGNED,
PRIMARY KEY (project_id)
);
CREATE TABLE posts (
post_id INT(11) UNSIGNED,
project_id INT(11) UNSIGNED,
PRIMARY KEY (post_id)
);
내 PHP 코드에서 클라이언트를 삭제할 때 모든 프로젝트 게시물을 삭제하고 싶습니다.
DELETE
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;
포스트 테이블은 외래 키를 가지고 있지 않습니다 client_id
만 project_id
. 통과 한 프로젝트에서 게시물을 삭제하고 싶습니다 client_id
.
게시물이 삭제되지 않아 지금 작동하지 않습니다.
답변
posts
테이블 에서 항목을 삭제하도록 지정하기 만하면됩니다 .
DELETE posts
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id
편집 : 자세한 내용은 이 대안 답변을 볼 수 있습니다
답변
여러 테이블을 선택하고 있으므로 삭제할 테이블이 더 이상 모호하지 않습니다. 다음을 선택 해야합니다 .
DELETE posts FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id
이 경우 table_name1
와 table_name2
같은 테이블이므로 다음과 같이 작동합니다.
DELETE projects FROM posts INNER JOIN [...]
원하는 경우 두 테이블 모두에서 삭제할 수도 있습니다.
DELETE posts, projects FROM posts INNER JOIN [...]
참고 order by
및 limit
멀티 테이블 삭제 작동하지 않습니다 .
또한 테이블의 별명을 선언하는 경우 테이블을 참조 할 때 별명을 사용해야합니다.
DELETE p FROM posts as p INNER JOIN [...]
답변
또는 약간 다른 (IMO 더 친숙한) 구문으로 같은 것 :
DELETE FROM posts
USING posts, projects
WHERE projects.project_id = posts.project_id AND projects.client_id = :client_id;
BTW, 조인을 사용하는 mysql의 경우 거의 항상 하위 쿼리보다 훨씬 빠릅니다.
답변
ALIAS를 이와 같이 사용하면 데이터베이스에서 방금 사용했습니다! t는 테이블을 삭제해야합니다!
DELETE t FROM posts t
INNER JOIN projects p ON t.project_id = p.project_id
AND t.client_id = p.client_id
답변
나는 이것에 대한 하위 쿼리 솔루션에 더 익숙하지만 MySQL에서는 시도하지 않았습니다.
DELETE FROM posts
WHERE project_id IN (
SELECT project_id
FROM projects
WHERE client_id = :client_id
);
답변
JOIN을 사용한 MySQL DELETE 레코드
일반적으로 SELECT 문에서 INNER JOIN을 사용하여 다른 테이블에 해당 레코드가있는 테이블에서 레코드를 선택합니다. 또한 INNER JOIN 절을 DELETE 문과 함께 사용하여 테이블에서 레코드를 삭제하고 다른 테이블의 해당 레코드를 삭제할 수 있습니다 (예 : 특정 조건을 만족하는 T1 및 T2 테이블에서 레코드를 삭제하는 경우).
DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition
DELETE와 FROM 사이에 테이블 이름 T1과 T2를 넣습니다. T1 테이블을 생략하면 DELETE 문은 T2 테이블의 레코드 만 삭제하고 T2 테이블을 생략하면 T1 테이블의 레코드 만 삭제됩니다.
조인 조건 T1.key = T2.key는 T2 테이블에서 삭제해야하는 해당 레코드를 지정합니다.
WHERE 절의 조건은 T1 및 T2에서 삭제할 레코드를 지정합니다.
답변
단일 테이블 삭제 :
posts
테이블 에서 항목을 삭제하려면 다음을 수행 하십시오.
DELETE ps
FROM clients C
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;
projects
테이블 에서 항목을 삭제하려면 다음을 수행 하십시오.
DELETE pj
FROM clients C
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;
clients
테이블 에서 항목을 삭제하려면 다음을 수행 하십시오.
DELETE C
FROM clients C
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;
여러 테이블 삭제 :
결합 된 결과에서 여러 테이블에서 항목을 삭제하려면 DELETE
쉼표로 구분 된 목록으로 뒤에 테이블 이름을 지정해야 합니다.
당신은 모든 세 개의 테이블 (에서 항목을 삭제하려는 가정 posts
, projects
, clients
특정 클라이언트에 대한) :
DELETE C,pj,ps
FROM clients C
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id