MySQL 警告 EXIT 处理程序因数据截断而被忽略

标签 mysql stored-procedures

在下面的MYSQL存储过程中,每当由于数据截断而出现警告时,都会显示警告。但它不会回滚任何东西。警告的退出处理程序完全被忽略。请帮忙。

DELIMITER $$

DROP PROCEDURE IF EXISTS `saveDetails` $$
CREATE DEFINER=`dbuser`@`%` PROCEDURE `saveDetails`(IN param_name VARCHAR(200))
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
    DECLARE EXIT HANDLER FOR SQLWARNING ROLLBACK;
    START TRANSACTION;
        UPDATE userDetails SET displaystatus = 2 where displaystatus = 1;
        UPDATE userDetails SET displaystatus = 1 where displaystatus = 0;
        UPDATE userDetails SET name = param_name;
    COMMIT;

END $$

DELIMITER ;

我也尝试了以下版本,但这也不起作用:

分隔符$$

DROP PROCEDURE IF EXISTS `saveDetails` $$
CREATE DEFINER=`dbuser`@`%` PROCEDURE `saveDetails`(IN param_name VARCHAR(200))
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING  
    BEGIN 
        ROLLBACK;
    END;
    START TRANSACTION;
        UPDATE userDetails SET displaystatus = 2 where displaystatus = 1;
        UPDATE userDetails SET displaystatus = 1 where displaystatus = 0;
        UPDATE userDetails SET name = param_name;
    COMMIT;

END $$

DELIMITER ;

最佳答案

有一个非常简单的例子,如下所示:

/*Table structure for table `mytable` */

DROP TABLE IF EXISTS `mytable`;

CREATE TABLE `mytable` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `value` INT(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB;

/*Data for the table `mytable` */

INSERT  INTO `mytable`(`value`) VALUES (100);

/* Procedure structure for procedure `saveDetails` */

/*!50003 DROP PROCEDURE IF EXISTS  `saveDetails` */;

DELIMITER $$

CREATE PROCEDURE `saveDetails`()
BEGIN
    DECLARE EXIT HANDLER FOR SQLWARNING ROLLBACK;
    START TRANSACTION;
    UPDATE `mytable` SET `value` = 'A' WHERE `id` = 1;
    COMMIT;
END$$

DELIMITER ;

一切都按预期进行:

mysql> SELECT `id`, `value` FROM `mytable`;
+----+-------+
| id | VALUE |
+----+-------+
|  1 |   100 |
+----+-------+
1 ROW IN SET (0.00 sec)

mysql> CALL saveDetails;
QUERY OK, 0 ROWS affected (0.02 sec)

mysql> SELECT `id`, `value` FROM `mytable`;
+----+-------+
| id | VALUE |
+----+-------+
|  1 |   100 |
+----+-------+
1 ROW IN SET (0.02 sec)

您可以显示:SHOW CREATE TABLE userDetails;

关于MySQL 警告 EXIT 处理程序因数据截断而被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19950116/

相关文章:

MYSQL 存储过程 - 如果满足某些条件则更新多个列

php - 即使查询不匹配,Mysql 结果也会重复

c++ - 使用 ODB ORM 执行存储过程

sql - 列数 每个过程返回 T-Sql

MySQL 存储过程总是选择 True

mysql - 如何编写程序将数据插入到phpmyadmin 中的表中?

sql - TSQL 可选 Where 子句

mysql - 如何使用2个带有OR条件的连接表来选择没有重复记录的sql数据

Python - 通过从B表中选择id来更新一个表中的多条记录的最快方法

mysql - 从数据库中选择空氏族