如何在其他表中插入忽略的MySQL行并在发现重复项时更新字段?

问题描述 投票:0回答:1

我正在尝试制作电话营销活动管理Web应用程序。应用程序用户可以将包括电话号码+状态字段的Excel工作表上载到应用程序,并在与客户通话时更新“状态”。上载Excel工作表后,所有数据都将转到名为“ tp_numb”的表。然后,我创建了“ MySQL insert ignore”,以将数据从“ tp_numb”复制到名为“ ok_list”的表中。找到重复项后,我需要更新“ 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;

上面的代码是我一直在尝试通过更新“ ok_list”表中“ status”字段的功能来改进的代码。因为电话号码的状态应该是根据上次上传的Excel文件的状态。发现重复项时如何更新状态?当找不到重复项时如何插入记录?

mysql sql insert-update
1个回答
1
投票

我认为您想要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);
© www.soinside.com 2019 - 2024. All rights reserved.