2014-02-11 9 views
1

여러 테이블에서 행을 삭제하고 싶습니다. 어떻게해야합니까? 나는 여러 테이블에서 행 삭제

DELETE a.*, b.*, c.* 
FROM table1 as a, table2 as b, table3 as c 
WHERE a.colName = 'value' 
AND b.colName = 'value' 
AND a.c.colName = 'value'; 

'value' 모든 테이블에 같은뿐만 아니라 colName입니다

을 시도했습니다.

이 쿼리 레코드는 모든 테이블에 있어야하지만 필자의 경우 레코드는 테이블에 있거나 없을 수 있습니다. 삭제 쿼리를 실행하면 기존 레코드가 삭제되고 그렇지 않으면 '0 row(s) affected'가 반환됩니다. 그래서 간단히이 쿼리를 3 번 ​​실행하고 싶습니다.

DELETE FROM table1 WHERE colName = 'value'; 
DELETE FROM table1 WHERE colName = 'value'; 
DELETE FROM table1 WHERE colName = 'value'; 

을 하나의 쿼리로 실행하고 싶습니다.

감사합니다.

+0

테이블 당 하나의 삭제를 발행합니다. – Randy

+0

이점은 무엇입니까? 3 줄 예제는 더 짧고 디버그하기 쉽습니다. 반면, 단일 delete 문은 아무 이유없이 거대한 조인을 생성합니다. (그리고 내부적으로 실패한 이유는 내부 조인이기 때문에 외부 조인으로 바꾸는 것이 좋습니다.) –

+0

PHP 서비스를 호출하여 이러한 레코드를 삭제하므로 하나의 쿼리 문자열에서 여러 쿼리를 보내는 경우 PHP 서비스가'mysql_query ($ query, $ link)'를 호출하기 때문에 작동하지 않을 것이다 mysql_query()는 보안상의 이유로 여러 문장을 실행할 수 없다 ... –

답변

1

조인과 삭제는 MySQL은 약간 이상하다. 이 같은 필요합니다

편집 :

내가 모든 행을 수집보기를 설정하는 것이 좋습니다

DELETE FROM 
    table1, table2, table3 
USING 
    table1 
LEFT JOIN 
    table2 ON table2.colName = table1.colName 
LEFT JOIN 
    table3 ON table3.colName = table1.colName 
WHERE 
    table1.colName = 'value' 
+0

아니, 그렇지 않다. 나는 그것을 시험해 보았지만 세 개의 테이블에 레코드가 존재하는 경우에만 작동합니다. 그렇지 않으면 레코드를 삭제하지 않을 것입니다 ... –

+0

죄송합니다. 그 질문을 놓치 셨습니다. 나는 그 일을하기위한 답을 업데이트했다. – mikea

+0

고마워. LEFT JOIN이 (가) 트릭을 했어. –

1

실제 문제는 여러 쿼리를 동시에 실행하기 때문에. 당신을위한 가장 좋은 방법은 mysqli 확장을 통합하고 이러한 쿼리 mysqli_multi_query()을 사용하는 것입니다 :

DELETE FROM table1 WHERE colName = 'value'; 
DELETE FROM table2 WHERE colName = 'value'; 
DELETE FROM table3 WHERE colName = 'value'; 
0

모든 테이블에 존재하지 않는 행을 허용하고 해당보기에서 삭제하려면 .

CREATE VIEW v AS 
SELECT colName FROM a 
UNION ALL 
SELECT colName FROM b 
UNION ALL 
SELECT colName FROM c 

그리고

DELETE FROM v 
WHERE colName = 'value' 
1

는 다음 사항을 고려 ...

DROP TABLE IF EXISTS table1; 

CREATE TABLE table1 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,colname CHAR(1) NOT NULL 
); 

DROP TABLE IF EXISTS table2; 

CREATE TABLE table2 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,colname CHAR(1) NOT NULL 
); 

DROP TABLE IF EXISTS table3; 

CREATE TABLE table3 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,colname CHAR(1) NOT NULL 
); 

INSERT INTO table1 (colname) VALUES ('x'),('y'),('z'); 

INSERT INTO table2 (colname) VALUES ('x'),('x'),('z'); 

INSERT INTO table3 (colname) VALUES ('y'),('y'),('z'); 

SELECT * FROM table1; 
    +----+---------+ 
    | id | colname | 
    +----+---------+ 
    | 1 | x  | 
    | 2 | y  | 
    | 3 | z  | 
    +----+---------+ 

SELECT * FROM table2; 
    +----+---------+ 
    | id | colname | 
    +----+---------+ 
    | 1 | x  | 
    | 2 | x  | 
    | 3 | z  | 
    +----+---------+ 

SELECT * FROM table3; 
    +----+---------+ 
    | id | colname | 
    +----+---------+ 
    | 1 | y  | 
    | 2 | y  | 
    | 3 | z  | 
    +----+---------+ 

DELETE a, b, c 
    FROM table1 a 
    JOIN table2 b 
    ON b.colname = a.colname 
    JOIN table3 c 
    ON c.colname = a.colname 
WHERE a.colName IN('x','z'); 

SELECT * FROM table1; 
    +----+---------+ 
    | id | colname | 
    +----+---------+ 
    | 1 | x  | 
    | 2 | y  | 
    +----+---------+ 

SELECT * FROM table2; 
    +----+---------+ 
    | id | colname | 
    +----+---------+ 
    | 1 | x  | 
    | 2 | x  | 
    +----+---------+ 

SELECT * FROM table3; 
    +----+---------+ 
    | id | colname | 
    +----+---------+ 
    | 1 | y  | 
    | 2 | y  | 
    +----+---------+ 

mikea가 입증되면서, 제거, 내부는 OUTER에 대한 조인 대체 할 수있는 'X' 값이 모두 표 3에서 누락 되었음에도 불구하고

+0

맞아.LEFT JOIN을 사용하고 있는데 지금은 잘 작동합니다 ... 답변 해 주셔서 감사합니다 .. –