mysql是否合并两个具有相似数据联合/联接的表?

a7qyws3x  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(447)

因此,我有两个表,其中大部分都是非常相似的数据,例如,每个表中的一行可能有相同的名字、姓氏和地址,但根据在单独的excel工作表中更新的最新可用数据,有不同的电话号码或电子邮件地址(不在我手中,我的工作只是将这些数据合并到我们最新的数据库中,他们计划从现在开始使用这个数据库,而不是excel表)。我只需要一个很好的方法来合并这些具有相同列名的表,而无需手动操作(大约24000+条记录)。
以下是两个表的create table语法:

CREATE TABLE `UsersUpdated` (
`FULLNME` longtext,
`LSTNME` varchar(23) CHARACTER SET utf8 DEFAULT NULL,
`FSTNME` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`MID` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`SUFF` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
`STAT` varchar(2) CHARACTER SET utf8 DEFAULT NULL,
`PTY` varchar(3) CHARACTER SET utf8 DEFAULT NULL,
`PH` bigint(20) DEFAULT NULL,
`ALTPH` bigint(20) DEFAULT NULL,
`DOB` datetime DEFAULT NULL,
`REGDTE` datetime DEFAULT NULL,
`ADDR` text,
`ST` int(11) DEFAULT NULL,
`STNME` varchar(19) CHARACTER SET utf8 DEFAULT NULL,
`APT` varchar(7) CHARACTER SET utf8 DEFAULT NULL,
`TWN` varchar(6) CHARACTER SET utf8 DEFAULT NULL,
`ZIP` int(11) DEFAULT NULL,
`W` int(11) DEFAULT NULL,
`d` int(11) DEFAULT NULL,
`G17` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`P17` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`G16` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`P16` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`G15` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`P15` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`G14` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`P14` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`SIGN` tinyint(1) NOT NULL DEFAULT '0',
`SUPP` tinyint(1) NOT NULL DEFAULT '0',
`NOTES` longtext,
`LTR` tinyint(1) DEFAULT NULL,
`REGISTERED` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `Users` (
`FULLNME` longtext,
`LSTNME` varchar(23) CHARACTER SET utf8 DEFAULT NULL,
`FSTNME` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`MID` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`SUFF` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
`STAT` varchar(2) CHARACTER SET utf8 DEFAULT NULL,
`PTY` varchar(3) CHARACTER SET utf8 DEFAULT NULL,
`PH` bigint(20) DEFAULT NULL,
`ALTPH` bigint(20) DEFAULT NULL,
`DOB` datetime DEFAULT NULL,
`REGDTE` datetime DEFAULT NULL,
`ADDR` text,
`ST` int(11) DEFAULT NULL,
`STNME` varchar(19) CHARACTER SET utf8 DEFAULT NULL,
`APT` varchar(7) CHARACTER SET utf8 DEFAULT NULL,
`TWN` varchar(6) CHARACTER SET utf8 DEFAULT NULL,
`ZIP` int(11) DEFAULT NULL,
`W` int(11) DEFAULT NULL,
`d` int(11) DEFAULT NULL,
`G17` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`P17` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`G16` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`P16` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`G15` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`P15` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`G14` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`P14` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`SIGN` tinyint(1) NOT NULL DEFAULT '0',
`SUPP` tinyint(1) NOT NULL DEFAULT '0',
`NOTES` longtext,
`LTR` tinyint(1) DEFAULT NULL,
`REGISTERED` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

如您所见,它们基本上是完全相同的表,我只需要正确地合并它们。

4jb9z9bj

4jb9z9bj1#

也许这是有帮助的。

update Users
set ADDR = (
    select ADDR from UsersUpdated uu
    where uu.FULLNME = Users.FULLNME and uu.DOB = Users.DOB
),  STNME = (
    select STNME from UsersUpdated uu
    where uu.FULLNME = Users.FULLNME and uu.DOB = Users.DOB
) ...
;

可以将所有列添加到单个更新中。根据数据库的大小,单独进行这些操作可能同样容易。
许多平台允许 from 带的子句 update 这允许一个连接和一个较短的查询,但可能会有问题。这样,如果任何子查询只返回一个值,就会出现错误。

doinxwow

doinxwow2#

我会修改 Users 表在应该相同的字段上添加一个唯一键(根据您的描述可能是fstnme、lstnme和addr,但您可能会使用其他一些列,例如@shawnt00建议的dob),然后 INSERT 数据来自 UsersUpdated 进入 Users 使用 ON DUPLICATE KEY UPDATE 子句将更新的数据复制到 Users 其中该用户已存在于该表中。当中有用户时,此查询也将起作用 UsersUpdated 谁还没有加入 Users . 所以,

ALTER TABLE Users ADD UNIQUE KEY NameAddr (FSTNME, LSTNME, ADDR);
INSERT INTO Users
   SELECT * FROM UsersUpdated
   ON DUPLICATE KEY UPDATE
      FULLNME=VALUES(FULLNME),
      LSTNME=VALUES(LSTNME),
      FSTNME=VALUKES(FSTNME),
      ...
      LTR=VALUES(LTR),
      REGISTERED=VALUES(REGISTERED);

相关问题