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

当一个excel工作表上传时,所有数据都保存到一个叫做"tp_numb"的表中,然后我使用"Mysql insert ignore"将数据从"tp_numb"复制到一个叫"ok_list"的表,发现重复项时,需要更新"ok_list"表中的"status"字段,如果没有重复项,则应将数据插入到"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"字段,如何在没有找到重复项的情况下插入记录?

时间:

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



...