繁体   English   中英

如何验证表更新并从另一个表迁移数据 - postgresql

[英]How to verify table update and migrate data from another table - postgresql

我的potgres数据库中有以下两个表,每种类型。

用户

userid       | bigint (PK) NOT NULL
username     | character varying(255)
businessname | character varying(255)

收件箱

messageid    | bigint (PK) NOT NULL
username     | character varying(255)
businessname | character varying(255)

我想在这里实现的是我想在inbox表中添加一个名为userRefId的新字段,并将user表的userid数据上的数据迁移到两个表中每个usernamebusinessname username匹配的地方。

这些是我用来做到这一点的查询。

ALTER TABLE inbox ADD userRefId bigint;

UPDATE inbox 
SET userRefId = u.userid
from "user" u
WHERE u.username = inbox.username 
AND u.businessname = inbox.businessname;

现在我想验证数据是否已正确迁移。 我可以采取哪些方法来实现这一目标? (注意: inbox上的username可以为空)

这足以验证吗?

select count(*) from inbox where username is not null;结果, select count(*) from inbox where username is not null; 等于

select count(userRefId) from inbox;

数据传输是否正确? 首先,更新看起来是正确的,所以你真的不需要担心。

您可以获取consumer_inbox收件箱中用户名不匹配的所有行

select ci.*. -- or count(*)
from consumer_inbox ci
where not exists (select 1
                  from user u
                  where ci.userRefId = u.userId
                 );

这并不意味着update不起作用。 只是consumer_inbox中的值没有匹配项。

在你的代码的情况下,这相当于:

select ci.*
from consumer_inbox ci
where userId is null;

尽管这不会选择设置为不匹配记录的userId (宇宙射线,有人吗?)。

您还可以验证用于匹配的附加字段:

select ci.*. -- or count(*)
from consumer_inbox ci
where not exists (select 1
                  from user u
                  where ci.userRefId = u.userId and
                        ci.username = u.username and
                        ci.businessname = u.businessname
                 );

但是,所有这些检查似乎都没有必要,除非您在表上有触发器或已知的不匹配记录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM