MySQL如何检查查询是否成功执行?
我有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; //
在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,那可能是一个错误的指示。
我已经将这个放在查询行后面的触发器中,但似乎它在失败时不起作用。 – narainsagar
由于我是一位非常有经验的读者,我可以告诉你,你在第42行的触发器中犯了一个错误。 – Shadow
我不明白。这是什么意思,即触发器的第42行? – narainsagar
请参阅在这里:https://*.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; //
可以产生success_flag或状态或每个手术后你算另一方面,你可以在日志表中存储错误/消息..这将传达你的操作记录:) –
嗨乔丹,虽然,我不想运行另一个操作/查询来计算/ etc。另外,或者如果我这样做,那么我怎样才能得到失败时发生的错误代码和消息? – narainsagar
顺便说一句,我想插入错误'(code,message)'到我的'errors'表中。 – narainsagar