2016-06-09 99 views
1

我有3个疑问:MySQL如何检查查询是否成功执行?

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; 

谢谢。

下面是一个使用处理程序简单的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; // 
+0

可以产生success_flag或状态或每个手术后你算另一方面,你可以在日志表中存储错误/消息..这将传达你的操作记录:) –

+0

嗨乔丹,虽然,我不想运行另一个操作/查询来计算/ etc。另外,或者如果我这样做,那么我怎样才能得到失败时发生的错误代码和消息? – narainsagar

+0

顺便说一句,我想插入错误'(code,message)'到我的'errors'表中。 – narainsagar

回答

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,那可能是一个错误的指示。

+0

我已经将这个放在查询行后面的触发器中,但似乎它在失败时不起作用。 – narainsagar

+0

由于我是一位非常有经验的读者,我可以告诉你,你在第42行的触发器中犯了一个错误。 – Shadow

+0

我不明白。这是什么意思,即触发器的第42行? – narainsagar

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