MySQL объединяет две таблицы с одинаковым объединением данных / объединением? - PullRequest
0 голосов
/ 06 мая 2018

Итак, у меня есть две таблицы, заполненные по большей части очень похожими данными, например, строка в каждой таблице может иметь одинаковые имя, фамилию и адрес, но иметь другой номер телефона или адрес электронной почты на основе на самых последних доступных данных, которые были обновлены в отдельном рабочем листе Excel (из моих рук, моя работа состоит в том, чтобы просто объединить эти данные в нашу последнюю базу данных, которую они планируют использовать здесь, а не в листе Excel). Мне просто нужен хороший способ объединить эти таблицы с одинаковыми именами столбцов, не делая это вручную (около 24 000+) записей.

Вот синтаксис создания таблицы для обеих таблиц:

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;

Как видите, это в основном одни и те же таблицы, мне просто нужно правильно их объединить.

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Я бы изменил таблицу Users, добавив в нее поля UNIQUE, которые должны быть одинаковыми (предположительно FSTNME, LSTNME и ADDR из вашего описания, но, возможно, вы могли бы использовать некоторые другие столбцы, например DOB, как предложено @ shawnt00) затем 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);
0 голосов
/ 06 мая 2018

Возможно, это полезно.

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, которое разрешает объединение и более короткий запрос, но это может быть проблематично. Таким образом, вы получите ошибки, если ни один из подзапросов не вернет только одно значение.

...