如何解决插入数据并用排名填充列
原始数据:orginal_table
MID STATE CALL_TIME RECORD_RANK
a 1 2020-12-18 09:00:00 1
a 2 2020-12-19 09:00:00 2
b 1 2020-12-18 09:00:02 1
c 1 2020-12-18 09:00:03 1
c 1 2020-12-19 09:00:03 2
c 1 2020-12-20 09:00:03 3
d 1 2020-12-19 09:00:00 1
我想插入的数据:insert_table
MID STATE CALL_TIME
a 2 2020-12-30 09:00:00
b 2 2020-12-19 09:00:02
c 1 2020-12-21 09:00:03
e 1 2020-12-30 09:00:00
f 1 2020-12-30 09:00:00
f 2 2020-12-31 09:00:00
目标
- 将从第二个数据插入原始数据。
- 对于原始数据和插入数据,
MID and CALL_TIME
对是唯一的。 - 插入的数据中没有
RECORD_RANK
列,但插入时会根据RECORD_RANK
计算MID and CALL_TIME columns
。当用不同的 CALL_TIME 复制 MID 时,带有 MID 的 RECORD_RANK 的值将加 1。初始值为 1。 - insert_table 中最早的行总是晚于 orginal_table 中具有相同 MID 的最新行。
预期的示例结果如下:
MID STATE CALL_TIME RECORD_RANK
a 1 2020-12-18 09:00:00 1
a 2 2020-12-19 09:00:00 2
b 1 2020-12-18 09:00:02 1
c 1 2020-12-18 09:00:03 1
c 1 2020-12-19 09:00:03 2
c 1 2020-12-20 09:00:03 3
d 1 2020-12-19 09:00:00 1
a 2 2020-12-30 09:00:00 3
b 2 2020-12-19 09:00:02 2
c 1 2020-12-21 09:00:03 4
e 1 2020-12-30 09:00:00 1
f 1 2020-12-30 09:00:00 1
f 2 2020-12-31 09:00:00 2
注意
- MysqL 版本:5.5.47-log
解决方法
如果 insert_table
中的 easiest 行总是晚于 orginal_table
中具有相同 MID
的最新行,那么您可以使用 BEFORE INSERT 触发器:
CREATE TRIGGER tr_bi_original
BEFORE INSERT
ON orginal_table
FOR EACH ROW
SET NEW.RECORD_RANK = (SELECT COALESCE(COUNT(*),0) + 1
FROM orginal_table
WHERE NEW.MID = orginal_table.MID)
触发器创建后,您可以简单地添加新行
INSERT INTO orginal_table
SELECT *,NULL FROM insert_table;
RECORD_RANK
的新值将由触发器添加。
如果两个表中的行将混合,并且必须更改 RECORD_RANK
中已经存在的某些行的 orginal_table
,则无法使用一个查询执行该操作(因为插入新行和更新现有的需要)。在这种情况下,我建议为 RECORD_RANK
列插入具有任何 (NULL) 值的行,然后重新计算表中所有行的列值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。