gpt4 book ai didi

mysql - 如果字段已经存在则触发 MySQL 增量

转载 作者:行者123 更新时间:2023-11-29 21:30:56 27 4
gpt4 key购买 nike

当我插入与另一行几乎相同的新行时,我想增加一个字段(唯一的区别是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_idcase_id 已存在于另一行中,我想增加新行的 loop_nb

在此示例中,行 805 添加在行 804 之后。知道805800几乎相同,触发器在插入数据库之前增加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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com