2014-02-15 2 views
0

두 개의 SQL 테이블 'products'및 'tags'가 있습니다. 이들은 세 번째 테이블 'product_tags'를 사용하여 n : m 관계를 유지합니다.mysql n : m 관계 삭제 쿼리 1242 하위 쿼리가 두 개 이상의 행을 반환합니다.

일부 제품과 해당 태그를 모두 삭제하고 싶습니다.

의 말을하자, 나는 = 3, 해당 제품이 tags.tag_id = 3, tags.tag_id = 5

product_tags 테이블

PRODUCT_ID 3 tag_id 3
PRODUCT_ID 3 tag_id 5

products.product_id있다
delete from tags where tag_id in (select product_tags.tag_id from product_tags where product_id =3); 
delete from tags where tag_in = any (select product_tags.tag_id from product_tags where product_id=3); 

하나가 생성됩니다

0 row(s) affected, 1 warning(s): 1242 Subquery returns more than 1 row 
,536,

그럼, 어떻게해야합니까?

답변

0

우선 다른 제품에서 사용하지 않는 태그를 삭제하는 것이 가장 좋습니다. 예 : tag_id = 3 태그가 다른 제품과 함께 사용되는 경우 product_id = 1라고 말하면이 태그를 삭제하면 안됩니다.

둘째 외래 키로 적절한 부모 - 자식 관계가있는 경우 적절한 순서로 테이블에서 행을 삭제해야합니다. 먼저 product_tags에서 행을 삭제해야합니다. 여기

CALL delete_product(3); 

SQLFiddle 데모

+0

난 정말 당신의 대답을 주셔서 감사합니다 :

는 코드가 안전하게

DELIMITER // CREATE PROCEDURE delete_product(IN _product_id INT) BEGIN DROP TEMPORARY TABLE IF EXISTS tmp_tags_to_be_deleted; START TRANSACTION; CREATE TEMPORARY TABLE tmp_tags_to_be_deleted(tag_id INT PRIMARY KEY); INSERT INTO tmp_tags_to_be_deleted SELECT tag_id FROM product_tags t WHERE product_id = _product_id AND NOT EXISTS ( SELECT * FROM product_tags WHERE tag_id = t.tag_id AND product_id <> t.product_id ); DELETE FROM product_tags WHERE product_id = _product_id; DELETE t FROM tags t JOIN tmp_tags_to_be_deleted x ON t.tag_id = x.tag_id; DELETE FROM products WHERE product_id = _product_id; COMMIT; END// DELIMITER ; 

사용 보일 수 있습니다 사용되지 않는 태그와 함께 제품을 삭제했다되고 그건 . 시간을 내 주셔서 감사합니다 !! 나는 당신의 해결책 ~을 시도 할 것입니다. 대단한 하루 되세요 ~! – coverboy