当我插入与另一行几乎相同的新行时,我想增加一个字段(唯一的区别是id_progress
)。为了更清楚起见,我将使用这个示例
+-------------+---------+---------+---------+
| id_progress | task_id | case_id | loop_nb |
+-------------+---------+---------+---------+
| 800 | 2001002 | 199 | null |
| 801 | 2001003 | 199 | null |
| 802 | 2002001 | 199 | null |
| 803 | 2002002 | 199 | null |
| 804 | 2001002 | 200 | null |
| 805 | 2001002 | 199 | 1 |
| 806 | 2001002 | 199 | 2 |
+-------------+---------+---------+---------+
如果 task_id
和 case_id
已存在于另一行中,我想增加新行的 loop_nb
。
在此示例中,行 805
添加在行 804
之后。知道805
与800
几乎相同,触发器在插入数据库之前增加loop_nb。
我尝试了一些东西,我对触发还很陌生,很抱歉我做错了
BEGIN
DECLARE loop_nb integer;
SET @loop_nb := (select loop_nb
from progress
where task_id = NEW.task_id
AND case_id = NEW.case_id
DESC LIMIT 1 );
IF ISNULL(@loop_nb) THEN
SET @loop_nb := @loop_nb+1;
END IF;
SET NEW.loop_nb = @loop_nb;
END
但问题是我的loop_nb
默认为null
。而且我认为我没有权限更改它。
还有其他选择吗?
如果我可以将loop_nb的默认值更改为'0'
,我的代码应该没问题吗?
最佳答案
也许像下面这样的代码可以提供帮助,至少可以给您一些想法。
mysql> DELIMITER //
mysql> DROP TRIGGER IF EXISTS `trg_bi_progress`//
Query OK, 0 rows affected (0.00 sec)
mysql> DROP TABLE IF EXISTS `progress`//
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE `progress` (
-> `id_progress` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> `task_id` VARCHAR(7),
-> `case_id` INT UNSIGNED,
-> `loop_nb` INT UNSIGNED
-> )//
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TRIGGER `trg_bi_progress` BEFORE INSERT ON `progress`
-> FOR EACH ROW
-> BEGIN
-> SET NEW.`loop_nb` := (
-> SELECT NULLIF(COUNT(`id_progress`), 0)
-> FROM `progress`
-> WHERE `task_id` = NEW.`task_id`
-> AND `case_id` = NEW.`case_id`
-> );
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO `progress` (`task_id`, `case_id`)
-> VALUES
-> ('2001002', 199),
-> ('2001003', 199),
-> ('2002001', 199),
-> ('2002002', 199),
-> ('2001002', 200),
-> ('2001002', 199),
-> ('2001002', 199)//
Query OK, 7 rows affected (0.00 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> DELIMITER ;
mysql> SELECT
-> `id_progress`,
-> `task_id`,
-> `case_id`,
-> `loop_nb`
-> FROM
-> `progress`;
+-------------+---------+---------+---------+
| id_progress | task_id | case_id | loop_nb |
+-------------+---------+---------+---------+
| 1 | 2001002 | 199 | NULL |
| 2 | 2001003 | 199 | NULL |
| 3 | 2002001 | 199 | NULL |
| 4 | 2002002 | 199 | NULL |
| 5 | 2001002 | 200 | NULL |
| 6 | 2001002 | 199 | 1 |
| 7 | 2001002 | 199 | 2 |
+-------------+---------+---------+---------+
7 rows in set (0.00 sec)
关于mysql - 如果字段已经存在则触发 MySQL 增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35267231/