首页 > 解决方案 > 如何在 Mysql 中修改 INSERT ON DUPLICATE 的新记录

问题描述

情况

想象一个表列 A、B、C,在 B 和 C 上具有唯一键,在 A 上具有自动增量主键

当发送新值 (B,C) (42,1) 并且该表已经包含 B,C 为 42 和 1 的行时,假设 ID 为 10,那么 Mysql 服务器将不允许这样做并返回:

Duplicate Entry ... for key ... . 

问题:

我想对此采取行动并将 C 的值修改(增加)为 2,因此可以插入 (42,2)。

失败的尝试解决方案

我找到了 INSERT .. ON DUPLICATE UPDATE ... 但这会更新现有记录。不是新的价值观。

  1. 现有记录可能无法编辑
  2. 我没有办法事先查询表,一切都应该在 1 个查询中完成
  3. 增加的新值也可能已经存在,因此应该继续增加(c = 3..4..5...)

知道如何做到这一点吗?

标签: mysqlon-duplicate-key

解决方案


嗯。我不认为它是数据库的共同特征。我已经过期了 MySQL e Informix。我知道哪些论文数据库对某些操作有触发:

https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html

我用 MySQL 创建了一个示例:

架构

CREATE TABLE tb (A INT NOT NULL AUTO_INCREMENT PRIMARY KEY, B INT, C INT);

扳机

CREATE TRIGGER upd_c_column 
BEFORE INSERT ON tb
FOR EACH ROW
SET NEW.C = (
    SELECT DISTINCT IFNULL(
        (SELECT IF(COUNT(*) IS NULL, 1, COUNT(*) + 1) AS B_ocurrences
        FROM tb sub_tb 
        WHERE sub_tb.B = NEW.B 
        GROUP BY sub_tb.B), 1)
);

插入测试

INSERT INTO tb (B) VALUES (10), (10), (10), (10), (20), (20), (30);

SELECT * FROM tb;    
+----+----+---+
| A  | B  | C |
+----+----+---+
| 73 | 10 | 1 |
| 74 | 10 | 2 |
| 75 | 10 | 3 |
| 76 | 10 | 4 |
| 77 | 20 | 1 |
| 78 | 20 | 2 |
| 79 | 30 | 1 |
+----+----+---+

它解析为 INSERT... 如果您需要执行 UPDATE 或 DELETE,您将需要使用其他策略创建其他触发器。


推荐阅读