• 中文
    • 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.6k
    • 梁兴健

      请登录之后再进行评论

      登录

      赞助本站

      • 支付宝
      • 微信
      • QQ

      感谢一直支持本站的所有人!

      单栏布局 侧栏位置: