代码之家  ›  专栏  ›  技术社区  ›  Rick

如果值不同,如何插入或更新?

  •  0
  • Rick  · 技术社区  · 6 年前

    我正在尝试编写一个SQL查询,当它更新另一列时,该查询会将值设置为1。

    具体来说,如果相应的散列被更改,我想将is_patch_文件设置为1。如果哈希列未更改,则它应保留当前存储的“是修补程序”文件值。

    这可能吗?

    表结构

    DROP TABLE IF EXISTS `program_files`;
    CREATE TABLE `program_files` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `folder_id` int(10) unsigned NOT NULL,
      `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
      `path` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
      `hash` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
      `enabled` tinyint(1) NOT NULL DEFAULT '1',
      `created_at` timestamp NULL DEFAULT NULL,
      `updated_at` timestamp NULL DEFAULT NULL,
      `is_patch_file` tinyint(1) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`),
      UNIQUE KEY `unique_file` (`folder_id`,`name`,`path`,`hash`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    

    SQL查询

    INSERT INTO program_files (folder_id, name, path, hash, is_patch_file, enabled, created_at, updated_at) VALUES (3, 'TestName', 'TestPath', 'TestHash', 0, 1, NOW(), NOW()) ON DUPLICATE KEY UPDATE 
    is_patch_file=1, #Is Patch file should ONLY be 1 if the hash is different from the original hash...otherwise keep our current value how do I do this?
    hash=VALUES(hash),
    updated_at=VALUES(updated_at);
    
    INSERT INTO program_files (folder_id, name, path, hash, is_patch_file, enabled, created_at, updated_at) VALUES (3, 'TestName', 'TestPath', 'TestHash2', 0, 1, NOW(), NOW()) ON DUPLICATE KEY UPDATE 
    is_patch_file=1, #Is Patch file should ONLY be 1 if the hash is different from the original hash...otherwise keep our current value how do I do this?
    hash=VALUES(hash),
    updated_at=VALUES(updated_at);
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Barmar    6 年前

    你可以比较 hash VALUES(hash) 在更新之前,并在设置时使用 is_patch_file 是的。

    ON DUPLICATE KEY UPDATE 
        is_patch_file = hash != VALUES(hash), 
        hash = VALUES(hash), 
        updated_at = VALUES(updated_at)