Как вставить игнорируемые строки MySQL в другую таблицу и обновить поле при обнаружении дубликатов? - PullRequest
1 голос
/ 27 октября 2019

Я пытаюсь создать веб-приложение для управления кампаниями телемаркетинга. Пользователь приложения может загружать листы Excel, включая номер телефона + поля состояния, в приложение и обновлять «статус», когда он звонит клиентам. Когда лист Excel загружен, все данные отправляются в таблицу с именем "tp_numb". Затем я создал «MySQL insert ignore», чтобы скопировать данные из «tp_numb» в таблицу с именем «ok_list». Мне нужно обновить поле «status» в таблице «ok_list», когда найдены дубликаты. Если дубликаты не найдены, данные должны быть вставлены в таблицу «ok_list».

CREATE TABLE `tp_numb` (
  `id` int(11) NOT NULL,
  `number` varchar(10) NOT NULL,
  `ref_id` int(10) NOT NULL,
  `status` int(1) NOT NULL DEFAULT '0',
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE `ok_list` (
  `id` int(11) NOT NULL,
  `tp_numb_id` int(10) NOT NULL,
  `number` varchar(10) NOT NULL,
  `status` int(2) NOT NULL,
  `notes` text,
  `status_updated_on` datetime DEFAULT NULL,
  `ref_id` int(10) NOT NULL,
  `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `assign` int(10) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT IGNORE INTO ok_list (tp_numb_id, number, status, ref_id)
SELECT t.id, t.number, t.status, r.ref_id
FROM tp_numb t, reference r
WHERE t.ref_id = r.ref_id;

Над кодом указан код, который я пытался улучшить с помощью функции обновления поля «status» втаблица "ok_list". Потому что статус телефонных номеров должен быть статусом в соответствии с последним загруженным файлом Excel. Как я могу обновить статус при обнаружении дубликата? Как вставить запись, если дубликаты не найдены?

1 Ответ

1 голос
/ 27 октября 2019

Я думаю, что вы хотите on duplicate key update:

INSERT INTO ok_list (tp_numb_id, number, status, ref_id)
    SELECT t.id, t.number, t.status, r.ref_id
    FROM tp_numb t JOIN
         reference r
         ON t.ref_id = r.ref_id
    ON DUPLICATE KEY UPDATE status = VALUES(status);

Ваш вопрос предполагал, что для каждого номера существует только одна строка. Я на самом деле не уверен, какой это столбец, но вы должны иметь уникальное ограничение / индекс, чтобы он знал, какая строка обновляется со статусом. Я думаю это tp_numb_id, что было бы;

create unique index unq_ok_list_tp_numb_id on ok_list(tp_numb_id);
...