如何将忽略 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);
我正在尝试制作电话营销活动管理网络应用程序。 应用程序用户可以将 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);