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

标签 mysql triggers

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

相关文章:

mysql - htaccess 重写图像目录的子域

mysql - 多个 MAX() 函数,每个函数具有不同的条件

javascript - 使用 php Javascript 滚动浏览表格中的记录

mysql - 如何设置mysql多触发器

postgresql - 防止和/或检测 postgres 中的循环

php - Laravel/Eloquent 查询效率: Should a separate table be used for these two columns?

mysql - 对两个字段的数据进行排序

sql - 自动计算非标准自增

添加触发器时 Mysql 错误 - 怎么会正确?

php - 外部启动 PHP 脚本的 MYSQL 触发器