MySQL 如何检查查询是否成功执行?

3

我有3个查询:

1. INSERT, 2. UPDATE and 3. DELETE

我想知道是否有方法可以直接检查查询是否成功执行,而无需运行另一个查询来进行检查。如果没有成功执行(即返回错误/异常),我希望将该错误/异常保存到某些变量中。例如,下面是我的查询:
插入查询:
INSERT INTO `users` (id, name, age) VALUES (NEW.id, NEW.name, NEW.age);

UPDATE查询:

UPDATE `test_db2`.`users`
        SET name = NEW.name,
            age = NEW.age
        WHERE id = NEW.id;

DELETE查询:

DELETE FROM `test_db2`.`users`
        WHERE id = OLD.id;

谢谢。

这是使用Handler的简单INSERT触发器(我尝试过):

DELIMITER //

-- TRIGGER FOR INSERT
DROP TRIGGER IF EXISTS `test_db1_users_ai`;
CREATE TRIGGER `test_db1_users_ai` AFTER INSERT ON `users` FOR EACH ROW 
BEGIN
    -- Perform the insert
    INSERT INTO `test_db2`.`users` (id, name, age) VALUES (NEW.id, NEW.name, NEW.age);
    -- Handler if this ^ above INSERT fails. 
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
        GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
        --SET @full_error = CONCAT("ERROR ", @errno, " (", @sqlstate, "): ", @text);
        INSERT INTO `test_db1`.`errors` (error_code, error_message) VALUES (@errno, @text);
        --SELECT @full_error;
    END;
END; //

您可以在每次操作后生成success_flag或status或count,另一方面,您可以将错误/消息存储在日志表中..这将传达您的操作记录 :) - Ankit Agrawal
嗨Jordan,虽然我不想运行另一个操作/查询来计数/等等。或者如果我这样做了,那么如何获取发生故障时的错误代码和消息? - narainsagar
顺便提一下,我想将错误(代码,消息)插入到我的errors表中。 - narainsagar
2个回答

2
请参考这里:https://dev59.com/7Zfga4cB1Zd3GeqPBMtB#37853801 引用自上述来源:
请查看下面的内容:
-- TRIGGER FOR INSERT
DROP TRIGGER IF EXISTS `test_db1_users_ai`;
CREATE TRIGGER `test_db1_users_ai` AFTER INSERT ON `users` FOR EACH ROW 
BEGIN
    -- Declare variables to hold diagnostics area information
    DECLARE errorCode CHAR(5) DEFAULT '00000';
    DECLARE errorMessage TEXT DEFAULT '';

    -- Declare exception handler for failed insert
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 
    BEGIN
      GET DIAGNOSTICS CONDITION 1
        errorCode = RETURNED_SQLSTATE, errorMessage = MESSAGE_TEXT;
    END;

    -- Perform the insert
    INSERT INTO `test_db2`.`users` (id, name, age) VALUES (NEW.id, NEW.name, NEW.age);

    -- Check whether the insert was successful
    IF errorCode != '00000' THEN
        INSERT INTO `errors` (code, message, query_type, record_id, on_db, on_table) VALUES (errorCode, errorMessage, 'insert', NEW.id, 'test_db2', 'users');
    END IF;
END; //

2
在MySQL中,您可以声明错误/警告处理程序来捕获各种错误和警告。如果将处理程序与获取诊断命令结合使用,则可以在通用处理程序中捕获精确的错误/警告。我在Improve your Stored Procedure Error Handling with GET DIAGNOSTICS博客文章中发现了如何在MySQL存储程序中捕获错误消息的总结。请注意保留HTML标签。
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
    GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
    SET @full_error = CONCAT("ERROR ", @errno, " (", @sqlstate, "): ", @text);
    SELECT @full_error;
END;

如果需要,显然可以将错误日志记录在@full_error表中。如果没有错误处理程序介入,则SQL语句成功运行。

使用插入和更新时,您还可以使用row_count()函数来确定受影响的记录数。如果此数字为0,则可能表示出现了错误。


我已经将这个放在我的触发器中,在查询行之后,但似乎在失败时它不起作用。 - narainsagar
由于我是一位经验丰富的心灵读者,我可以告诉你,在触发器的第42行中你犯了一个错误。 - Shadow
我不明白。那是什么意思,比如触发器的第42行? - narainsagar
你对你的某段代码进行了某些更改。你没有分享这些更改和最终代码,但你期望我告诉你哪里出了问题。嗯,那需要具备读心能力。 - Shadow
哦,是的!!我已经添加在问题描述的最后了。 - narainsagar
请阅读有关处理程序的文档,不要随意将处理程序插入到您的代码中。我的答案的第一个链接指向此文档。 - Shadow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接