如何将自动递增值附加到重复值?

时间:2016-12-29 18:07:36

标签: mysql duplicates append auto-increment

我可以访问我们每天从云服务检索并存储在mysql数据库中的报告数据集(我无法控制),以便在本地与第三方数据可视化软件一起运行高级报告和报告。

数据通常在id字段上具有重复值,在与其他表连接以进行数据分析时会产生问题。

例如:

 +-------------+----------+------------+----------+
 | workfile_id | zip_code |    date    |   total  |
 +-------------+----------+------------+----------+
 |       78002 |    90210 | 2016-11-11 | 2010.023 |
 |       78002 |    90210 | 2016-12-22 |  427.132 |
 +-------------+----------+------------+----------+

Workfile_id是重复的,因为这是同一个工作,但是工作的其他工作是在与原始工作不同的月份中执行的。而不是为作业创建另一个工作文件ID的软件,使用相同的。

当存在多个相同的id时,在workfile_id上​​与其他表进行连接是有问题的,所以我想知道是否可以做以下两件事之一:

  1. 使重复的workfile_id唯一。当找到重复项时,让sql在工作文件ID中附加一个数字。第一个副本(或第二次出现的相同工作文件ID)需要在工作文件id的末尾附加.01。然后,如果插入了另一个副本,则需要自动递增附加的数字,比如说.02,依此类推任何后续的重复workfile_id。这种方法最适合我们的数据,但我很奇怪从性能角度看这对服务器有多困难。如果我可以安排在插入数据后进行更改以加快初始数据插入,那将是理想的。
  2. 总计列并删除重复的workfile_id行。有一个标识重复workfile_ids的任务,并对重复项的财务列求和,用新总和替换原始总计并删除后面的“新行”列已添加到一起。 从数据保存的角度来看,这更加混乱,但如果第一种解决方案不可行,则可以接受。
  3. 我的假设是每次插入数据时服务器将新的workfile_id值与所有现有的worlfile_id值进行比较会有很大的开销,但是我们的数据集很小,新数据每天只在上午1:30插入一次,并且将重复的workfile_id搜索到最后6个月内插入的行也应该是可行的。

    在列(workfile_id)中找到重复项并且在自动递增值上附加到workfile_id可能吗?

    修改 根据下面sdsc81的回答,我无法让我的触发器工作。 有什么想法吗?

    DELIMITER //
    
    CREATE TRIGGER append_subID_to_workfile_ID_salesjournal
    AFTER INSERT
       ON salesjournal FOR EACH ROW
    
    BEGIN
       SET @COUNTER = ( SELECT (COUNT(*)-1) FROM salesjournal WHERE workfile_id = NEW.workfile_id );
       IF @COUNTER > 1 THEN
           UPDATE salesjournal SET workfile_id = CONCAT(workfile_id, @COUNTER) WHERE id = NEW.id;
       END IF;
    
    END;//
    
    DELIMITER ;
    

    很难知道触发器根本不工作,或者只是触发器中的代码不起作用。我没有插入错误。有没有办法调试触发器错误?

1 个答案:

答案 0 :(得分:0)

嗯,一切都是可行的;)

你不控制数据集,但你可以修改数据库,对吗? 然后,您可以在>每次插入新值后使用触发器,如果重复,则更新它。类似的东西:

SET @COUNTER = ( SELECT (COUNT(*)-1) FROM *your_table* WHERE workfile_id = NEW.workfile_id );
IF @COUNTER > 1 THEN
    UPDATE *your_table* SET workfile_id = CONCAT(workfile_id, @COUNTER) WHERE some_unique_id = NEW.some_unique_id;
END IF;

如果每天只有一个插入,并且在workfile_id值上定义了一个索引,则根本不应该对您的服务器造成任何问题。

此外,您可以实施第二个解决方案:

DELIMITER //

CREATE TRIGGER append_subID_to_workfile_ID_salesjournal
AFTER INSERT ON salesjournal FOR EACH ROW

BEGIN
SET @COUNTER = ( SELECT (COUNT(*)-1) FROM salesjournal WHERE workfile_id = NEW.workfile_id );
IF @COUNTER > 1 THEN
    UPDATE salesjournal SET total = total + NEW.total WHERE workfile_id = NEW.workfile_id AND id <> NEW.id;
    DELETE FROM salesjournal WHERE id = NEW.id;
END IF;

END;//

DELIMITER ;

希望这有帮助。