4

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

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

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

4

2 回答 2

6

只需添加单词unsigned。我删除了(10)just 因为它无关紧要。它只是描述了应显示多少位,但它始终是一个 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';

有关详细信息,请参阅手册。

于 2012-06-05T16:35:35.463 回答
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。

于 2012-06-05T16:31:48.453 回答