• 中文
    • English
  • 注册
  • 查看作者
  • 8-5:MySQL 创建带有IN类型参数的存储过程

    将删除记录封装成存储过程:

    mysql> CREATE PROCEDURE removeUSerByID(IN id INT UNSIGNED)
        -> BEGIN
        -> DELETE FROM users WHERE id = id;
        -> END;
        -> //
    Query OK, 0 rows affected (0.00 sec)

    可以看到即使只有一条语句,也可以使用BEGIN和END

    这里的IN指的是:表示该参数的值必须在调用存储过程时指定,参数名为id,数据类型为INT UNSIGNED

    调用存储过程:

    mysql> DELIMITER ;
    mysql> CALL removeUserByID(3);
    Query OK, 8 rows affected (0.00 sec)
    
    mysql> SELECT * FROM users;
    Empty set (0.00 sec)

    为什么我们想删除的是id为3的记录,而实际上却把整个数据表记录都删除了呢?

    这是因为虽然我们认为在封装的时候DELETE FROM users WHERE id = id; 第一个id指的的是数据表中的字段,而第二个id和IN后面的id都是指以后需要传递的参数,但是数据库并不这样认为,它无法区分这两个id的不同含义,所以id = id 默认为真,直接删除了整张表

    所以给参数的时候,参数名不能和数据表中的记录名相同,所以需要修改存储过程

    但是修改存储过程的时候注意不能修改过程体,想要修改过程体只能删除存储过程再进行重建,删除存储过程的语法结构:

    DROP PROCEDURE [IF EXISTS] sp_name

    我们删除刚才创建的存储过程:

    mysql> DROP PROCEDURE removeUserByID;
    Query OK, 0 rows affected (0.00 sec)

    重新插入一些记录(因为教程中没有提供data.sql,所以我就自己做了十几条记录,大家可以直接复制下面的语句插入):

    INSERT USERS(username,password,age,sex) VALUES('A','202cb962ac59075b964b07152d234b70','21','0');
    INSERT USERS(username,password,age,sex) VALUES('B','c8ffe9a587b126f152ed3d89a146b445','23','0');
    INSERT USERS(username,password,age,sex) VALUES('C','3def184ad8f4755ff269862ea77393dd','20','1');
    INSERT USERS(username,password,age,sex) VALUES('D','ffeed84c7cb1ae7bf4ec4bd78275bb98','20','0');
    INSERT USERS(username,password,age,sex) VALUES('E','a5481cd6d7517aa3fc6476dc7d9019ab','21','0');
    INSERT USERS(username,password,age,sex) VALUES('F','42ae1544956fbe6e09242e6cd752444c','20','1');
    INSERT USERS(username,password,age,sex) VALUES('G','9958517b2a48851d2ada1c76c88cfc56','22','0');
    INSERT USERS(username,password,age,sex) VALUES('H','fe2610f1476e7027b25bd1dd132110c5','20','0');
    INSERT USERS(username,password,age,sex) VALUES('I','0723dfd10075aee37a1804a728349dc3','20','1');
    INSERT USERS(username,password,age,sex) VALUES('J','a35aea60fe097c885568babb48ee7d1e','23','0');
    INSERT USERS(username,password,age,sex) VALUES('K','157eda051e0176607c170a16e1c37ee1','20','0');
    INSERT USERS(username,password,age,sex) VALUES('L','8d7354980e33bdd1e7e53a019b61321c','20','0');
    INSERT USERS(username,password,age,sex) VALUES('M','212f992316d58d06d2cdc35020fa9dac','23','1');
    INSERT USERS(username,password,age,sex) VALUES('N','6512bd43d9caa6e02c990b0a82652dca','25','0');
    INSERT USERS(username,password,age,sex) VALUES('O','1c222c9181f2dfcc08ca42e869cf88c8','20','0');
    INSERT USERS(username,password,age,sex) VALUES('P','4031d16f69847588e8c8cb7950a72a47','28','1');
    INSERT USERS(username,password,age,sex) VALUES('Q','8fb5a3e7338ce951971d69be27fc5210','20','0');
    INSERT USERS(username,password,age,sex) VALUES('R','4e4d6c332b6fe62a63afe56171fd3725','27','0');

    然后重新创建存储过程:

    mysql> CREATE PROCEDURE removeUSerByID(IN p_id INT UNSIGNED)
        -> BEGIN
        -> DELETE FROM users WHERE id = p_id;
        -> END;
        -> //
    Query OK, 0 rows affected (0.00 sec)

    然后删除id为34的记录:

    mysql> CALL removeUserBYID(34);
        -> //
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SELECT * FROM users WHERE id = 34;
        -> //
    Empty set (0.00 sec)

    可以看到删除成功

  • 0
  • 0
  • 0
  • 7.9k
  • 梁兴健

    请登录之后再进行评论

    登录
    单栏布局 侧栏位置: