programing

Mysql - 하나의 쿼리로 여러 테이블에서 삭제

codeshow 2023. 8. 15. 11:48
반응형

Mysql - 하나의 쿼리로 여러 테이블에서 삭제

나는 각각 사용자에 대한 다른 정보를 저장하는 4개의 테이블을 가지고 있습니다.각 테이블에는 어떤 행이 어떤 사용자에게 속하는지 식별하기 위한 user_id 필드가 있습니다.사용자를 삭제하려면 여러 테이블에서 해당 사용자 정보를 삭제하는 것이 가장 좋은 방법입니까?제 목표는 한 번의 질문으로 그것을 하는 것입니다.

쿼리:

"DELETE FROM table1 WHERE user_id='$user_id';
DELETE FROM table2 WHERE user_id='$user_id';
DELETE FROM table3 WHERE user_id='$user_id';
DELETE FROM table4 WHERE user_id='$user_id';";

분명히, 그것은 가능합니다.설명서에서:

DELETE 문에 여러 테이블을 지정하여 WHERE 절의 특정 조건에 따라 하나 이상의 테이블에서 행을 삭제할 수 있습니다.그러나 다중 테이블 DELETE에서는 ORDER BY 또는 LIMIT를 사용할 수 없습니다.table_references 절은 조인과 관련된 테이블을 나열합니다.이 구문은 섹션 12.2.8.1 "JOIN 구문"에 설명되어 있습니다.

설명서의 예는 다음과 같습니다.

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

1:1이 적용되어야 합니다.

테이블에서 외부 키 제약 조건을 정의할 수 있습니다.ON DELETE CASCADE선택.

그런 다음 상위 테이블에서 레코드를 삭제하면 하위 테이블에서 레코드가 제거됩니다.

다음 링크를 확인하십시오. http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

다음 쿼리도 사용할 수 있습니다.

DELETE FROM Student, Enrollment USING Student INNER JOIN Enrollment ON Student.studentId = Enrollment.studentId WHERE Student.studentId= 51;

이 경우 조인 문은 불필요하게 복잡합니다.원래 질문은 지정된 사용자의 레코드를 여러 테이블에서 동시에 삭제하는 것만 다룹니다.직관적으로 다음과 같은 기능이 작동할 것으로 예상할 수 있습니다.

DELETE FROM table1,table2,table3,table4 WHERE user_id='$user_id'

물론, 그렇지 않습니다.그러나 여러 개의 문(중복적이고 비효율적)을 작성하거나 조인(초보자에게는 어려움) 또는 외래 키(초보자에게는 훨씬 더 어렵고 일부 엔진이나 기존 데이터 세트에서는 사용할 수 없음)를 사용하는 대신 LOOP로 코드를 단순화할 수 있습니다!

PHP를 사용하는 기본 예제(여기서 $db는 연결 핸들):

$tables = array("table1","table2","table3","table4");
foreach($tables as $table) {
  $query = "DELETE FROM $table WHERE user_id='$user_id'";
  mysqli_query($db,$query);
}

이것이 누군가에게 도움이 되기를 바랍니다!

외래 키가 있는 두 테이블에서 다음 쿼리를 시도할 수 있습니다.

DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition

다음 쿼리를 사용하여 여러 테이블에서 행을 삭제할 수 있습니다.

DELETE table1, table2, table3 FROM table1 INNER JOIN table2 INNER JOIN table3 WHERE table1.userid = table2.userid AND table2.userid = table3.userid AND table1.userid=3

DELETE 설명서에는 다중 테이블 구문이 나와 있습니다.

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    tbl_name[.*] [, tbl_name[.*]] ...
    FROM table_references
    [WHERE where_condition]

또는:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    FROM tbl_name[.*] [, tbl_name[.*]] ...
    USING table_references
    [WHERE where_condition]

일반적으로 다른 답변과 같이 JOIN을 사용하지 않는 한 여러 테이블에서 한 번에 삭제할 수 없습니다.

그러나 모든 테이블이 특정 이름으로 시작하는 경우 이 쿼리는 해당 작업을 수행하는 쿼리를 생성합니다.

SELECT CONCAT('DELETE FROM ', GROUP_CONCAT(TABLE_NAME SEPARATOR ' WHERE user_id=123;DELETE FROM ') , 'FROM table1;' ) AS statement FROM information_schema.TABLES WHERE TABLE_NAME LIKE 'table%'

그런 다음 실행을 위해 mysql 명령어로 파이프를 연결합니다.

예를 들어 다음과 같은 결과가 생성됩니다.

DELETE FROM table1 WHERE user_id=123;
DELETE FROM table2 WHERE user_id=123;
DELETE FROM table3 WHERE user_id=123;

셸 지향의 예는 다음과 같습니다.

echo "SHOW TABLES LIKE 'table%'" | mysql | tail -n +2 | xargs -L1 -I% echo "DELETE FROM % WHERE user_id=123;" | mysql -v

MySQL만 사용하려면 다음과 같은 고급 쿼리를 사용할 수 있습니다.

SET @TABLES = (SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_NAME LIKE 'table%');
PREPARE drop_statement FROM 'DELETE FROM @tables';
EXECUTE drop_statement USING @TABLES;
DEALLOCATE PREPARE drop_statement;

위의 예는 MySQL 특정 접두사가 있는 모든 테이블 삭제/삭제를 기반으로 합니다.

일반적으로, 나는 이것이 트리거에서 시행되는 '확장 삭제'로 예상됩니다. 당신은 메인 레코드만 삭제하면 되고, 그러면 트리거 로직에 의해 모든 종속 레코드가 삭제될 것입니다.

이 논리는 당신이 쓴 것과 비슷할 것입니다.

언급URL : https://stackoverflow.com/questions/4839905/mysql-delete-from-multiple-tables-with-one-query

반응형