在 MySQL 中的 DUPLICATE KEY UPDATE 部分使用 CASE 或 IF 语句时,更新方案无法正常工作

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

我需要在 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。否则,它应该是较旧的现有记录值。

有人可以帮忙解决这个问题吗?

提前致谢。

mysql bulkinsert insert-update on-duplicate-key bulkupdate
1个回答
0
投票

根据您的要求,如果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);
© www.soinside.com 2019 - 2024. All rights reserved.