我有一个从数据库中的所有表中删除用户信息的过程。
CREATE PROCEDURE `unrollme_version3`.`del_user` (in v_user_id int(10))
BEGIN
START TRANSACTION;
DELETE FROM user_table1 WHERE `user_id` = v_user_id;
DELETE FROM user_table2 WHERE `user_id` = v_user_id;
DELETE FROM user_table3 WHERE `user_id` = v_user_id;
COMMIT;
END
我想在某种程度上使输入变量只是无符号的,以匹配数据库结构的设置方式。这是可能的,最佳做法是什么。
答案 0 :(得分:4)
只需添加unsigned
一词即可。我删除了(10)
只是因为它无关紧要。它只描述了应该显示多少位数,但它总是一个4字节的int。
CREATE PROCEDURE `unrollme_version3`.`del_user` (in v_user_id int unsigned)
BEGIN
START TRANSACTION;
DELETE FROM user_table1 WHERE `user_id` = v_user_id;
DELETE FROM user_table2 WHERE `user_id` = v_user_id;
DELETE FROM user_table3 WHERE `user_id` = v_user_id;
COMMIT;
END
您可以通过执行
强制抛出错误而不是警告SET sql_mode='STRICT_ALL_TABLES';
有关详细信息,请参阅manual.
答案 1 :(得分:0)
您可以将代码中的v_user_id签入为负数,然后返回错误。
CREATE PROCEDURE `unrollme_version3`.`del_user` (in v_user_id int(10))
BEGIN
if v_user_id < 0 then
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid user_id passed';
end if;
START TRANSACTION;
DELETE FROM user_table1 WHERE `user_id` = v_user_id;
DELETE FROM user_table2 WHERE `user_id` = v_user_id;
DELETE FROM user_table3 WHERE `user_id` = v_user_id;
COMMIT;
END
编辑未签名的部分。上面只是简单的SQL,用于在提供超出范围的数据时执行raiserror或信号。