Programming

MySQL에서 조인으로 삭제

procodes 2020. 2. 14. 23:48
반응형

MySQL에서 조인으로 삭제


내 테이블을 작성하는 스크립트는 다음과 같습니다.

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_idproject_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_name1table_name2동일한 테이블이므로 작동합니다.

DELETE projects FROM posts INNER JOIN [...]

원하는 경우 두 테이블 모두에서 삭제할 수도 있습니다.

DELETE posts, projects FROM posts INNER JOIN [...]

참고 order bylimit 멀티 테이블 삭제 작동하지 않습니다 .

또한 테이블의 별명을 선언하는 경우 테이블을 참조 할 때 별명을 사용해야합니다.

DELETE p FROM posts as p INNER JOIN [...]

Carpetsmoker 등의 기여 .


또는 약간 다른 (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

아래처럼 시도하십시오 :

DELETE posts.*,projects.* 
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;

서브을 사용하여 삭제하는 또 다른 방법은 그 사용하는 것보다 더 나은 선택 IN이 될 것입니다WHERE EXISTS

DELETE  FROM posts
WHERE   EXISTS ( SELECT  1 
                 FROM    projects
                 WHERE   projects.client_id = posts.client_id);

조인 대신 이것을 사용하는 한 가지 이유는 DELETEwith를 JOIN사용 하는 것을 금지하기 때문입니다 LIMIT. 전체 테이블 잠금을 생성하지 않도록 블록을 삭제하려는 LIMIT경우이 DELETE WHERE EXISTS방법을 사용하여 추가 할 수 있습니다 .


mysql> INSERT INTO tb1 VALUES(1,1),(2,2),(3,3),(6,60),(7,70),(8,80);

mysql> INSERT INTO tb2 VALUES(1,1),(2,2),(3,3),(4,40),(5,50),(9,90);

하나의 테이블에서 DELETE 레코드 :

mysql> DELETE tb1 FROM tb1,tb2 WHERE tb1.id= tb2.id;

두 테이블 모두에서 레코드 삭제

mysql> DELETE tb2,tb1 FROM tb2 JOIN tb1 USING(id);

가입이 작동하지 않으면이 솔루션을 사용해보십시오. 외래 키 + 특정 위치 조건을 사용하지 않을 때 t1에서 고아 레코드를 삭제하기위한 것입니다. 즉, "code"필드가 비어 있고 "name"필드와 일치하는 table2에 레코드가없는 table1에서 레코드를 삭제합니다.

delete table1 from table1 t1 
    where  t1.code = '' 
    and 0=(select count(t2.name) from table2 t2 where t2.name=t1.name);

이 시도,

DELETE posts.*
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id

-삭제가 필요한 테이블에는 별칭을 사용할 수 없습니다.

DELETE tbl_pagos_activos_usuario
FROM tbl_pagos_activos_usuario, tbl_usuarios b, tbl_facturas c
Where tbl_pagos_activos_usuario.usuario=b.cedula
and tbl_pagos_activos_usuario.cod=c.cod
and tbl_pagos_activos_usuario.rif=c.identificador
and tbl_pagos_activos_usuario.usuario=c.pay_for
and tbl_pagos_activos_usuario.nconfppto=c.nconfppto
and NOT ISNULL(tbl_pagos_activos_usuario.nconfppto)
and c.estatus=50

참고 URL : https://stackoverflow.com/questions/652770/delete-with-join-in-mysql



반응형