the*_*ory 8 mysql runtime-error exception
我正在编写迁移测试以确保用户是由迁移创建的.如果用户不存在,则测试应该抛出错误.起初,我以为我可以使用零错误除法来得到我想要的东西:
SET SESSION sql_mode = 'error_for_division_by_zero';
SELECT 1/COUNT(*) FROM mysql.user WHERE user = 'foo';
Run Code Online (Sandbox Code Playgroud)
但是,如果foo不存在,则不会抛出错误.原来error_for_division_by_zero只影响INSERT和UPDATE陈述.
然后我想也许我可以用错误数量的参数调用一些函数:
SELECT IF(COUNT(*) = 1, 1, date_format(1, 2, 3))
FROM mysql.user WHERE user = 'foo';
Run Code Online (Sandbox Code Playgroud)
但即使这样,它也会死亡 foo存在,,大概是因为解析器注意到错误的参数计数.
我可以写一个模拟引发异常的函数,但我试图避免这种情况.有没有办法强迫MySQL有条件地抛出运行时异常?
the*_*ory 11
遗憾的是,如果没有存储过程或函数,就无法完成.我想出了如何在我的应用程序中支持一个功能.借用这个答案的基本程序理念,我想出了这个:
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;
|
Run Code Online (Sandbox Code Playgroud)
我们的想法是,该函数可以在CHECK约束中使用,也可以在SQL语句中内联使用.如果用户不存在,回到原来需要抛出错误,我现在使用这样的checkit()函数:
SELECT checkit(COUNT(*), 'User "foo" does not exist')
FROM mysql.user WHERE user = 'foo';
Run Code Online (Sandbox Code Playgroud)
如果用户foo存在,则此查询返回整数.如果用户不存在,则会在其中定义消息时抛出错误.
想要将该函数用于检查约束吗?他就是一个例子(模仿这个答案),给@ 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;
Run Code Online (Sandbox Code Playgroud)
我宁愿使用DO,而不是设置一个虚拟变量,但MySQL错误会阻止它工作,唉.
| 归档时间: |
|
| 查看次数: |
6584 次 |
| 最近记录: |