mysql - 如何在 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 个查询中完成
- 增加的新值也可能已经存在,因此应该继续增加(c = 3..4..5...)
知道如何做到这一点吗?
解决方案
嗯。我不认为它是数据库的共同特征。我已经过期了 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,您将需要使用其他策略创建其他触发器。
推荐阅读
- python - 从 ORM 中提取数据并按日期分组
- java - 是否有兼容 Java 1.7 的 Artemis JMS 客户端?
- laravel - 使用 eloquent laravel 插入外键
- php - Nginx 多个 root 取决于用户代理
- powershell - 如何对目录中的每个文件执行命令?
- apache-spark - 没有组/聚合的 Spark SQL HAVING 子句
- java - 我不能在 Servlet url-pattern 中添加任何目录路径吗?
- amazon-web-services - AWS CDK - 部署后操作
- c# - 模拟的 UserManager 在测试中并没有真正按预期工作
- r - 在 R 中解析时间格式