无法同时使用SIGNAL和INSERT

时间:2016-05-05 23:53:54

标签: mysql triggers

我遇到此触发器的问题。当我在IF条件中使用INSERT和SIGNAL语句时,不执行插入。但是,如果没有SIGNAL,则完成插入。有人对此有解释吗?我主要担心的是我需要插入和SIGNAL语句来取消主插入(抛出触发器的插入)

    DELIMITER //
CREATE TRIGGER log_venta BEFORE INSERT ON `venta_producto`
FOR EACH ROW BEGIN
    DECLARE value int;
    DECLARE valor_venta int;
    DECLARE saldo_cliente int;
    DECLARE cliente_id int;

    SELECT cliente INTO cliente_id FROM venta WHERE id=NEW.ventaID;
    SELECT credito INTO saldo_cliente FROM cliente WHERE no_cliente=cliente_id;
    SELECT precio INTO valor_producto FROM producto WHERE id=NEW.producto;

    SET valor_venta = NEW.cantidad*valor_producto;

    IF valor_venta > saldo_cliente THEN
      INSERT INTO log(cliente) VALUES (cliente_id);
      SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'ERROR';
    END IF; 
END
//
DELIMITER ;

由于

1 个答案:

答案 0 :(得分:1)

  

14.6.7.5 SIGNAL Syntax

     

。 。

     

SIGNAL是   “返回”错误的方法。

     

。 。


  

21.3.1 Trigger Syntax and Examples

     

。 。

     
      
  • 对于事务表,语句失败应导致回滚语句执行的所有更改。失败了   触发器导致语句失败,因此触发器失败也会导致   回滚。对于非事务性表,无法进行此类回滚,   因此,虽然声明失败,但在此之前执行的任何更改   错误点仍然有效。
  •   
     

。 。

以上提到的内容可以在以下示例中说明:

mysql> DROP TABLE IF EXISTS `venta_producto`;
Query OK, 0 rows affected (0.00 sec)

mysql> DROP TABLE IF EXISTS `log`;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `venta_producto` (
    ->   `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    ->   `cliente_id` INT UNSIGNED
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE IF NOT EXISTS `log` (
    ->   `cliente_id` INT UNSIGNED
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER //

mysql> CREATE TRIGGER `log_venta` BEFORE INSERT ON `venta_producto`
    -> FOR EACH ROW
    -> BEGIN
    ->   INSERT INTO `log` (`cliente_id`) VALUES (NEW.`cliente_id`);
    ->   SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'ERROR';
    -> END//
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;

mysql> INSERT INTO `venta_producto`
    ->   (`cliente_id`)
    -> VALUES
    ->   (1);
ERROR 1643 (02000): ERROR

mysql> SELECT
    ->   `id`,
    ->   `cliente_id`
    -> FROM
    ->   `venta_producto`;
Empty set (0.00 sec)

mysql> SELECT
    ->   `cliente_id`
    -> FROM
    ->   `log`;
Empty set (0.00 sec)

mysql> ALTER TABLE `log` ENGINE=MyISAM;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> INSERT INTO `venta_producto`
    ->   (`cliente_id`)
    -> VALUES
    ->   (2);
ERROR 1643 (02000): ERROR

mysql> SELECT
    ->   `id`,
    ->   `cliente_id`
    -> FROM
    ->   `venta_producto`;
Empty set (0.00 sec)

mysql> SELECT
    ->   `cliente_id`
    -> FROM
    ->   `log`;
+------------+
| cliente_id |
+------------+
|          2 |
+------------+
1 row in set (0.00 sec)