mysql - 如何让 MySQL 在 SQL 中抛出条件运行时异常

标签 mysql exception runtime-error

我正在编写迁移测试以确保用户是由迁移创建的。如果用户不存在,测试应该抛出一个错误。起初,我以为我可以只使用除以零错误来得到我想要的:

SET SESSION sql_mode = 'error_for_division_by_zero';
SELECT 1/COUNT(*) FROM mysql.user WHERE user = 'foo';

但是,如果 foo 不存在,这不会抛出错误。结果是 error_for_division_by_zero affects only INSERT and UPDATE statements .

然后我想也许我可以用错误数量的参数调用一些函数:

SELECT IF(COUNT(*) = 1, 1, date_format(1, 2, 3))
  FROM mysql.user WHERE user = 'foo';

但即使 foo 确实存在,它也会死掉,大概是因为解析器注意到不正确的参数计数。

我可以写一个a function that emulates raising an exception ,但我试图避免这种情况。有没有办法强制 MySQL 有条件地抛出运行时异常?

最佳答案

不幸的是,没有存储过程或函数就无法完成。不过,我想出了如何在我的应用程序中支持一个功能。借用 this answer 中的基本程序思想,我想出了这个:

DELIMITER |

CREATE FUNCTION checkit(doit INTEGER, message VARCHAR(256)) RETURNS INTEGER DETERMINISTIC
BEGIN
    IF doit IS NULL OR doit = 0 THEN
        SIGNAL SQLSTATE 'ERR0R' SET MESSAGE_TEXT = message;
    END IF;
    RETURN doit;
END;
|

这个想法是该函数可以用在触发器中,例如 CHECK 约束,或者在 SQL 语句中内联。回到我最初需要在用户不存在时抛出错误,我现在使用 checkit() 函数,如下所示:

SELECT checkit(COUNT(*), 'User "foo" does not exist')
  FROM mysql.user WHERE user = 'foo';

如果用户 foo 存在,则此查询返回一个整数。如果用户不存在,它会抛出错误并在此处定义消息。

也想将该函数用于检查约束吗?他就是一个例子(模仿 this answer ),向@rouland-bouman 致敬:

CREATE TRIGGER mytabletriggerexample BEFORE INSERT FOR EACH ROW
BEGIN
    SET @dummy := checkit(
        NEW.important_value) >= (fancy * dancy * calculation),
        'Your meaningful error message goes here'
    );
END;

我宁愿使用DO,也不愿设置虚拟变量,但是a MySQL bug唉,阻止了它的工作。

关于mysql - 如何让 MySQL 在 SQL 中抛出条件运行时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17406675/

相关文章:

php - 操作预先编写的 MySQL 查询 - PHP

python - 为什么异常是可迭代的?

java - 错误 java.lang.NoClassDefFoundError : com/mongodb/MongoClient

php - PDO 向 MySQL 发送原始查询,而 Mysqli 发送准备好的查询,两者产生相同的结果

php - mysql连接3个表并计数

mySQL 从一个表中选择另一个表中不存在的表,并且不是第三个表中的子表

java.lang.ArrayIndexOutOfBoundsException : length=4; index=4 length array 异常

c++ - boost::python 导出自定义异常并继承自 Python 的 Exception

python - RuntimeError : Expected all tensors to be on the same device, 但在恢复训练时发现至少两个设备,cuda :0 and cpu!

exception - (Neko) "alc_cleanup: 1 device not closed"而不是错误消息