[sql] ID가 다른 테이블과 일치하지 않는 SQL 행 삭제
mysql 테이블에서 고아 항목을 삭제하려고합니다.
나는 이와 같은 2 개의 테이블을 가지고있다 :
표 files
:
| id | ....
------------
| 1 | ....
| 2 | ....
| 7 | ....
| 9 | ....
테이블 blob
:
| fileid | ....
------------
| 1 | ....
| 2 | ....
| 3 | ....
| 4 | ....
| 4 | ....
| 4 | ....
| 9 | ....
fileid
및 id
열 함께 테이블을 조인하는 데 사용할 수 있습니다.
테이블 blob
에서 fileid
찾을 수없는 테이블의 모든 행을 삭제하고 싶습니다 files.id
.
따라서 위의 예를 사용하면 blob
테이블 에서 3 & 4 행이 삭제 됩니다.
답변
LEFT JOIN / IS NULL 사용 :
DELETE b FROM BLOB b
LEFT JOIN FILES f ON f.id = b.fileid
WHERE f.id IS NULL
존재하지 않는 사용 :
DELETE FROM BLOB
WHERE NOT EXISTS(SELECT NULL
FROM FILES f
WHERE f.id = fileid)
NOT IN 사용 :
DELETE FROM BLOB
WHERE fileid NOT IN (SELECT f.id
FROM FILES f)
경고
가능하면 트랜잭션 내에서 DELETE를 수행하고 (지원되는 경우 : IE : MyISAM에 없음) 롤백을 사용하여 문제가 발생할 경우 변경 사항을 되돌릴 수 있습니다.
답변
DELETE FROM blob
WHERE fileid NOT IN
(SELECT id
FROM files
WHERE id is NOT NULL/*This line is unlikely to be needed
but using NOT IN...*/
)
답변
DELETE FROM blob
WHERE NOT EXISTS (
SELECT *
FROM files
WHERE id=blob.id
)
답변
delete from table1 t1
WHERE not exists (select id from table2 where related_field_in_t2=t1.id)
AND not exists (select id from table3 where related_field_in_t3=t1.id)
AND not exists (select id from table4 where related_field_t4=t1.id)
AND not exists (select id from table5 where related_field_t5=t1.id);