2016-10-05 1 views
0

안녕하세요 3 개의 테이블에서 여러 레코드를 삭제하려고합니다. 그러나 예상대로 작동하지 않습니다.여러 테이블에서 MySQL 레코드를 삭제하면 예상대로 작동하지 않습니다.

내 쿼리 :

DELETE FROM offer, offer_products, offer_product_addons 
USING offer, offer_products, offer_product_addons 
WHERE offer.offer_number IS NULL 
AND offer_products.offer_id = offer.id 
AND offer_product_addons.offer_products_id = offer_products.id; 

내 생각 엔 다른 테이블 중 하나에서 발견에 대한 기록이없는 경우 it't 레코드를 삭제하지 않습니다. 이 작업을 수행하려면 어떻게해야합니까? 이미 조인을 시도했지만 주 테이블의 내용 만 삭제합니다.

답변

1

CASCADE 기능을 여러 작업, 즉 삭제 또는 업데이트에 사용하는 것이 더 좋습니다.

CASCADE - ON UPDATE CASCADE 또는 ON UPDATE SET NULL가 계단식 기간 중 이전에 업데이트 된 동일한 테이블을 업데이트하기 위해 반복되는 경우 RESTRICT처럼 작동합니다. 즉, 자체 참조 ON 업데이트 캐스케이 또는 ON UPDATE SET NULL 작업을 사용할 수 없습니다. 이는 계단식 업데이트로 인한 무한 루프를 방지하기위한 것입니다. 반면 자기 참조 ON DELETE SET NULL이 가능하며 자기 참조 ON DELETE CASCADE도 있습니다. 계단식 작업은 15 레벨 이상 중첩 될 수 없습니다.

가끔 부모 테이블에서 데이터를 삭제할 때 참조 작업의 영향을받는 테이블을 확인하는 것이 유용합니다. 다음과 같이 당신은 INFORMATION_SCHEMA 데이터베이스에 referential_constraints에서이 데이터를 조회 할 수 있습니다

코드 :

USE information_schema; 
SELECT table_name 
FROM referential_constraints 
WHERE constraint_schema = 'database_name' AND 
     referenced_table_name = 'parent_table' AND 
     delete_rule = 'CASCADE' 

예 :

예를 들어, 건물과 연관된 테이블을 찾을 수 테이블에 CASCADE delete ruleclassicmodels 데이터베이스에 있으면 다음 쿼리를 사용합니다.

USE information_schema; 

SELECT table_name 
FROM referential_constraints 
WHERE constraint_schema = 'classicmodels' AND 
     referenced_table_name = 'buildings' AND 
     delete_rule = 'CASCADE' 

DELETE CASCADE에 대한 또 다른 대안 예 :

경우 cascading deletes 그 다음 당신은 잘못하여 외래 키를 설정 한, 죽은 카테고리의 일원 이었기 때문에 제품을 핵무기. 예제 테이블이 주어지면 다음 테이블을 설정해야합니다 :

CREATE TABLE category (
    id int unsigned not null primary key, 
    name VARCHAR(255) default null 
)Engine=InnoDB; 

CREATE TABLE product (
    id int unsigned not null primary key, 
    name VARCHAR(255) default null 
)Engine=InnoDB; 

CREATE TABLE category_product (
    category_id int unsigned not null, 
    product_id int unsigned not null, 
    PRIMARY KEY (category_id, product_id), 
    KEY pkey (product_id), 
    FOREIGN KEY (category_id) REFERENCES category (id) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE, 
    FOREIGN KEY (product_id) REFERENCES product (id) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
)Engine=InnoDB; 
+0

좋아요,하지만 지금은 옵션 캐스케이드 외래 키를 사용하도록 테이블을 변경할 수있는 옵션이 없습니다. 다른 간단한 방법이 있습니까? 이것을 한 번 사용하여 정리하려면? – Iason

+0

@lason 코드가 실패하고 조인 테이블에 값이 없으면 테이블에 조인 할 조건이 없습니다. 혼자 그 목적을 위해 당신은 캐스 캐 이드해야하고 이것은 대량 삭제 또는 대량 업데이트를 구현하는 데 매우 유용 할 것입니다. –

+0

@Naresh에 대한 설명에 감사드립니다. 기회가 생기면 테이블을 바꿀 것입니다. – Iason

관련 문제