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

时间:2016-06-09 12:53:50

标签: mysql sql

我有3个查询:

1. INSERT, 2. UPDATE and 3. DELETE

我想知道是否存在以至于我可以直接检查(即,如果查询执行成功与否则不运行另一个检查查询)?如果它没有(即返回一些错误/异常),那么我想将该错误/异常保存到某些变量中?

例如,以下是我的查询:

INSERT查询:

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; //

2 个答案:

答案 0 :(得分:1)

在MySQL中,您可以声明可以捕获各种错误和警告的error / warning handlers。如果将处理程序与get diagnostics command组合在一起,那么您甚至可以捕获通用处理程序中的确切错误/警告。

我在Improve your Stored Procedure Error Handling with GET DIAGNOSTICS上发现了以下博客文章,总结了如何在MySQL中存储的程序中捕获错误消息:

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,则可能表示存在错误。

答案 1 :(得分:0)

请参阅此处:https://stackoverflow.com/a/37853801/5228251

  

在下面查看(即,从上面的来源复制):

-- 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; //