在mysql存储过程中执行unsigned参数的正确方法是什么

时间:2012-06-05 16:05:14

标签: mysql stored-procedures

我有一个从数据库中的所有表中删除用户信息的过程。

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

我想在某种程度上使输入变量只是无符号的,以匹配数据库结构的设置方式。这是可能的,最佳做法是什么。

2 个答案:

答案 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或信号。