1

我正在 MySQL 中编写一个从视图中读取条目并根据各种条件将行插入另一个表的过程。在这种情况下,我有多达 4 个可能的size_id变量,命名my_size_1, my_size_2, my_size_3my_size_4. 如果它们没有值,它们是NULL。在我的存储过程中编写以下表达式会导致 SQL 错误:

-- 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之后添加一个,但是所有不必要的插入都会大大减慢存储过程。为什么第一块无效的SQL?

谢谢。

4

2 回答 2

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;
于 2012-07-13T17:33:22.250 回答
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

输入值不能为空,所以不用担心空插入。

于 2012-06-27T20:23:27.897 回答