gpt4 book ai didi

mysql - 用同一个表的克隆值替换字段值

转载 作者:行者123 更新时间:2023-11-29 11:53:53 25 4
gpt4 key购买 nike

我有一个包含以下字段的表。

Account,DeviceID,timestamp,odometer

前三个字段为主键一些deviceID被克隆到不同的帐户中。现在这些克隆人的里程表已损坏。

Account,DeviceID,timestamp,odometer
1 A 001 145
1 A 002 147
1 A 003 148
2 A 001 145
2 A 002 NULL
2 A 003 0

账户 2 中的设备 A 是账户 1 中设备 A 的克隆。

那么,如何将帐户 1 和设备 A 中的里程表值克隆到帐户 2 中设备 A 的相同时间戳?

我需要创建一个存储过程,可以使用三个参数(OriginalAccount、CloneAccount、DeviceID)提供该存储过程,以一一修复所有克隆。

编辑:

如果我有以下数据

+---------+-----------+-----------+----------+
| account | device_id | timestamp | odometer |
+---------+-----------+-----------+----------+
| 1 | A | 001 | 145 |
| 1 | A | 002 | 147 |
| 1 | A | 003 | 148 |
| 2 | A | 001 | 145 |
| 2 | A | 002 | NULL |
| 2 | A | 003 | 0 |

调用存储过程后,表必须如下所示

+---------+-----------+-----------+----------+
| account | device_id | timestamp | odometer |
+---------+-----------+-----------+----------+
| 1 | A | 001 | 145 |
| 1 | A | 002 | 147 |
| 1 | A | 003 | 148 |
| 2 | A | 001 | 145 |
| 2 | A | 002 | 147 |
| 2 | A | 003 | 148 |

最佳答案

架构

create table thing7
( account int not null,
device_id varchar(10) not null,
`timestamp` int(3) zerofill not null, -- not a great column name btw (it is a keyword, not a reserved word)
odometer int null,
primary key(account,device_id,timestamp)
);
insert thing7(account,device_id,timestamp,odometer) values
(1,'A',1,145),
(1,'A',2,147),
(1,'A',3,148),
(2,'A',1,145),
(2,'A',2,NULL),
(2,'A',3,0);

在开始时查看数据:

select * from thing7;
+---------+-----------+-----------+----------+
| account | device_id | timestamp | odometer |
+---------+-----------+-----------+----------+
| 1 | A | 001 | 145 |
| 1 | A | 002 | 147 |
| 1 | A | 003 | 148 |
| 2 | A | 001 | 145 |
| 2 | A | 002 | NULL |
| 2 | A | 003 | 0 |
+---------+-----------+-----------+----------+

存储过程

drop procedure if exists cloneIt;
DELIMITER $$
create procedure cloneIt
( srcAcct int, -- the data of the source to be copied
destAcct int, -- the target to receive it
device varchar(10)
)
BEGIN
-- clean out any old junk in case src does not match dest
-- this is due to edge conditions where dest has more rows than src, and you said you want a clone
delete from thing7 where account=destAcct and device_id=device;

-- now clone it
insert thing7(account,device_id,`timestamp`,odometer)
select destAcct,device_id,`timestamp`,odometer
from thing7
where account=srcAcct and device_id=device;
END
$$
DELIMITER ;

分隔符设置错误可能会浪费时间。拥有它们或研究它们的用途。

克隆 1 至 7:

call cloneIt(1,7,'A');

测试一个边缘条件:dest 比 src 拥有更多信息

insert thing7(account,device_id,timestamp,odometer) values
(14,'A',1,145),
(14,'A',2,147),
(14,'A',3,148),
(14,'A',4,199);

14 现在有 4 行

call cloneIt(1,14,'A');

查看结果:

select * from thing7;
+---------+-----------+-----------+----------+
| account | device_id | timestamp | odometer |
+---------+-----------+-----------+----------+
| 1 | A | 001 | 145 |
| 1 | A | 002 | 147 |
| 1 | A | 003 | 148 |
| 2 | A | 001 | 145 |
| 2 | A | 002 | NULL |
| 2 | A | 003 | 0 |
| 7 | A | 001 | 145 |
| 7 | A | 002 | 147 |
| 7 | A | 003 | 148 |
| 14 | A | 001 | 145 |
| 14 | A | 002 | 147 |
| 14 | A | 003 | 148 |
+---------+-----------+-----------+----------+

克隆可以用。它创建精确的克隆

关于mysql - 用同一个表的克隆值替换字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33551252/

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