将删除记录封装成存储过程:
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)
可以看到删除成功
请登录之后再进行评论