2012-06-27 76 views
1

我正在MySQL中編寫一個過程,該過程從視圖中讀取條目,並根據各種條件將行插入到另一個表中。在這種情況下,我有多達4個可能的size_id變量,名爲my_size_1, my_size_2, my_size_3my_size_4。如果他們沒有價值,他們是NULL。在寫我的存儲過程的結果下面的表達式在SQL錯誤:如果插入語句失敗,MySQL會發生多個錯誤

-- Insert recommendation options -- 
INSERT INTO `size_recommendation_options` 
VALUES (my_size_recommendation_id, my_size_1); 

IF my_size_2 IS NOT NULL THEN 
    INSERT INTO `size_recommendation_options` 
    VALUES (my_size_recommendation_id, my_size_2); 
END; 

IF my_size_3 IS NOT NULL THEN 
    INSERT INTO `size_recommendation_options` 
    VALUES (my_size_recommendation_id, my_size_3); 
END; 

IF my_size_4 IS NOT NULL THEN 
    INSERT INTO `size_recommendation_options` 
    VALUES (my_size_recommendation_id, my_size_4); 
END; 

...然而,去除IF陳述修正錯誤。也就是說,以下將運行得很好:

-- Insert recommendation options -- 
INSERT INTO `size_recommendation_options` 
VALUES (my_size_recommendation_id, my_size_1); 

INSERT INTO `size_recommendation_options` 
VALUES (my_size_recommendation_id, my_size_2); 

INSERT INTO `size_recommendation_options` 
VALUES (my_size_recommendation_id, my_size_3); 

INSERT INTO `size_recommendation_options` 
VALUES (my_size_recommendation_id, my_size_4); 

這是爲什麼?這不是世界末日 - 之後我可以添加一個DELETE FROM size_recommendation_options WHERE size_id IS NULL,但所有不必要的插入都會顯着減慢存儲的proc。爲什麼第一個塊無效的SQL?

謝謝。

+2

什麼是SQL的錯誤,特別是? –

+0

'你的SQL語法有錯誤;檢查與您的MySQL服務器版本對應的手冊,以找到在';'附近使用的正確語法。 \t \t \t \t IF my_size_3 IS NOT NULL THEN \t \t \t INSERT INTO'size_recommendati」在行65' – rybosome

+0

正如順便說一句,除非'size_recommendation_options'是在你的MySQL副本的保留字,刪除所有來自反引號你的SQL - 它們只是代碼噪聲。 – Bohemian

回答

1

IF塊必須與END IF關閉:

http://dev.mysql.com/doc/refman/5.6/en/if-statement.html

13.6.5.2. IF Syntax 

IF search_condition THEN statement_list 
    [ELSEIF search_condition THEN statement_list] ... 
    [ELSE statement_list] 
END IF 

你的情況:

IF my_size_2 IS NOT NULL THEN 
    INSERT INTO `size_recommendation_options` 
    VALUES (my_size_recommendation_id, my_size_2); 
END IF; 
+0

謝謝...我想確保你有信用。 =) – rybosome

0

你嘗試一個存儲過程?是這樣的:

CREATE PROCEDURE insert_val 
    (
     IN a_id     INT(11)  , 
     IN a_first      VARCHAR(15)  
    ) 
BEGIN 
if 
    INSERT INTO t1(actor_id, first_name) 
    VALUES (a_id, a_first) ; 
END 

mysql> call insert_val(10,'a'); 
Query OK, 1 row affected, 0 warning (0.00 sec) 

mysql> call insert_val(null,'a'); 
ERROR 1048 (23000): Column 'actor_id' cannot be null 

輸入值不能爲空,所以你並不需要擔心空的insert。