如何将忽略 MySQL 行插入另一个 table 并在发现重复项时更新字段?

How to insert ignore MySQL rows into another table and update a field when duplicates found?

我正在尝试制作电话营销活动管理网络应用程序。 应用程序用户可以将 Excel sheet 包括电话号码 + 状态字段上传到应用程序,并在他们打电话给客户时更新 "status"。上传 Excel sheet 时,所有数据都会转到名为 "tp_numb" 的 table。然后我创建了 "MySQL insert ignore" 以将数据从 "tp_numb" 复制到名为 "ok_list" 的 table。当发现重复项时,我需要更新 "ok_list" table 中的 "status" 字段。如果没有找到重复项,则应将数据插入 "ok_list" table.

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;

以上代码是我一直在尝试改进的代码,其中包含更新 "ok_list" table 中的 "status" 字段的功能。因为电话号码的状态应该是根据上次上传的Excel文件的状态。发现重复项时如何更新状态?找不到重复项时如何插入记录?

我想你想要 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);

你的问题假设每个数字只有一行。我实际上不确定是哪一列,但您应该有一个唯一的 constraint/index 以便它知道哪一行更新了状态。我认为tp_numb_id,也就是;

create unique index unq_ok_list_tp_numb_id on ok_list(tp_numb_id);