2014-01-29 66 views
1

我有要求刪除數據庫中某些表的子數據(外鍵約束映射)。所以,實際上,我想將返回的SELECT查詢的值傳遞給DELETE語句。如何將SELECT語句的返回值傳遞給存儲過程中的DELETE查詢?

以下是我創建的存儲過程,請幫助我瞭解這一點,並給出一些示例從表中刪除子行。

delimiter // 
create procedure deleteCustomerDeps(in emailAddr varchar(50)) 
begin 
select customer_id into custId 
from customer 
where customer_id=emailAddr; 
set @custoId=custId; 
delete from customer where customer_id='@custoId'; 
prepare stmt from @custoId; 
execute stmt; 
deallocate prepare stmt; 
end // 
delimiter ; 

TIA ....

+0

你沒有提到的子表(S):名稱,模式,如何與 – peterm

+0

Mr.Peter,只是我寫的樣本程序。這不是我的完整過程。可以讓我看看下面的場景使用子表的例子,假設有一個客戶表,它的依賴表是order_details。我想刪除爲客戶處理的訂單。您可以在我的示例過程中看到,我將電子郵件地址作爲參數,然後我將檢索客戶ID以傳遞到訂單表中進行刪除。所以,像這種情況下,我想刪除子表。請幫助我瞭解這一點.... – DIVA

回答

1

讓我們假設你有以下模式

CREATE TABLE customers 
(
    customer_id INT, 
    customer_email VARCHAR(17), 
    PRIMARY KEY (customer_id) 
); 
CREATE TABLE child_table 
(
    child_id INT, 
    customer_id INT, 
    value INT, 
    PRIMARY KEY (child_id), 
    FOREIGN KEY (customer_id) REFERENCES customers (customer_id) 
); 

我們刪除所有子記錄知道你可以使用多表刪除語法客戶的電子郵件

CREATE PROCEDURE deleteCustomerData(IN emailAddr VARCHAR(50)) 
    DELETE t 
    FROM child_table t JOIN customers c 
     ON t.customer_id = c.customer_id 
    WHERE c.customer_email = emailAddr; 

這裏是SQLFiddle演示


...但是,如果我想通過SELECT語句要刪除的返回值...

也就是說你在上面提到的做什麼例。但你總是可以把它改寫這樣

DELETE t 
    FROM child_table t JOIN 
(
    SELECT customer_id 
    FROM customers JOIN ... 
    WHERE customer_email = emailAddr 
    AND ... 
) c 
    ON t.customer_id = c.customer_id 

DELETE 
    FROM child_table 
WHERE customer_id IN 
(
    SELECT customer_id 
    FROM customers JOIN ... 
    WHERE customer_email = emailAddr 
    AND ... 
) 
+0

感謝您的幫助Mr.Peter.It將工作,但如果我想將SELECT stmt的返回值傳遞給DELETE查詢我應該怎麼做?請在郵件中查看我的存儲過程。 – DIVA

+0

查看更新的答案。在哪裏有多種方式來做到這一點,'JOIN'是最好的。你的程序代碼在語法上是不正確的,並且沒有多大意義,尤其是準備好的語句的使用。 – peterm

+0

是的......我知道proc在語法上是不正確的......感謝您的幫助Mr.Peter ..... – DIVA

相關問題