我需要在 MySQL 上进行批量插入和更新,所以我使用了 ON DUPLICATE KEY UPDATE。如果这些记录的名称或状态没有更改,我需要忽略更新者和更新日期字段作为现有旧数据。
请找到下面的代码,
INSERT INTO student
(group, name, status, created_by, created_date, updated_by, updated_date)
SELECT
group, name, status,
'system', UTC_TIMESTAMP(),
'system', UTC_TIMESTAMP()
FROM old_students
ON DUPLICATE KEY
UPDATE
group = VALUES(group),
status = VALUES(status),
name= VALUES(name),
updated_by =
(CASE
WHEN (VALUES(name) <> students.name)
THEN 'system'
ELSE students.updated_by
End),
updated_date =
(CASE
WHEN (VALUES(name) <> students.name)
THEN UTC_TIMESTAMP()
ELSE students.updated_date
End);
请查看下面的表格定义,
CREATE TABLE `old_students` (
`id` int NOT NULL AUTO_INCREMENT,
`group` varchar(40) Not NULL,
`name` varchar(40) DEFAULT NULL,
`status` varchar(10) DEFAULT NULL,
`created_by` varchar(10) NOT NULL,
`created_date` datetime NOT NULL,
PRIMARY KEY (`id`)
)
CREATE TABLE `students` (
`group` varchar(40) Not NULL,
`name` varchar(40) DEFAULT NULL,
`status` varchar(10) DEFAULT NULL,
`created_by` varchar(10) DEFAULT NULL,
`created_date` datetime DEFAULT NULL,
`updated_by` varchar(10) DEFAULT NULL,
`updated_date` datetime DEFAULT NULL,
primary key `group` (`group`)
)
真正的块没有在updated_by和updated_date列中执行。
我也尝试了 IF 语句,但不起作用。
updated_by = IF((VALUES(name) <> students.name), 'system', students.updated_by)
当新记录与现有记录值不同时,需要更新updated_by和updated_date。否则,它应该是较旧的现有记录值。
有人可以帮忙解决这个问题吗?
提前致谢。
根据您的要求,如果students和old_stuetns中的姓名不匹配,则会在表中插入新行。
在其他情况下,当 Students 和 old_stuetns 中的姓名匹配时,您会执行
ON DUPLICATE key UPDATE
。INSERT INTO student
(group, name, status, created_by, created_date, updated_by, updated_date)
SELECT
group, name, status,
'system', UTC_TIMESTAMP(),
'system', UTC_TIMESTAMP()
FROM old_students
ON DUPLICATE KEY
UPDATE
group = VALUES(group),
status = VALUES(status),
name= VALUES(name),
updated_by =
(CASE
WHEN (VALUES(status) <> students.status)
THEN old_students.created_by
ELSE students.updated_by
End),
updated_date =
(CASE
WHEN (VALUES(status) <> students.status)
THEN old_students.created_date
ELSE students.updated_date
End);