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

Mysql 如何将自动递增值附加到重复值?,mysql,duplicates,append,auto-increment,Mysql,Duplicates,Append,Auto Increment,我可以访问我无法控制的报告数据集,我们每天从云服务中检索并存储在mysql数据库中,以运行高级报告和报告,并在本地与第三方数据可视化软件相结合 数据在id字段上通常有重复值,这在与其他表合并进行数据分析时会产生问题 例如: +-------------+----------+------------+----------+ | workfile_id | zip_code | date | total | +-------------+----------+-------

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

数据在id字段上通常有重复值,这在与其他表合并进行数据分析时会产生问题

例如:

 +-------------+----------+------------+----------+
 | workfile_id | zip_code |    date    |   total  |
 +-------------+----------+------------+----------+
 |       78002 |    90210 | 2016-11-11 | 2010.023 |
 |       78002 |    90210 | 2016-12-22 |  427.132 |
 +-------------+----------+------------+----------+
工作文件_id重复,因为这是同一个作业,但该作业上的其他工作是在与原始工作不同的月份执行的。软件不会为作业创建另一个工作文件id,而是使用相同的id

当存在多个相同id时,在workfile_id上执行与其他表的联接是有问题的,因此我想知道是否可以执行以下两种操作之一:

使重复的工作文件\u id唯一。当发现重复项时,让sql向工作文件id追加一个数字。相同工作文件id的第一个副本或第二个副本需要在工作文件id的末尾追加.01。然后,如果插入另一个副本,则需要自动增加追加的数字,例如.02,这种方法最适合我们的数据,但我很好奇,从性能的角度来看,这对服务器来说有多困难。如果我可以安排在数据插入后进行更改,以加快初始数据插入,那将是理想的。 合计列数并删除重复的工作文件\u id行。有一项任务,用于识别重复的工作文件ID并对重复的财务列求和,用新的求和替换原始的合计,并在将列添加到一起后删除“新行”。 从数据保存的角度来看,这更为混乱,但如果第一种解决方案不可行,这是可以接受的。 我的假设是,每次插入数据时,让服务器将新的workfile_id值与所有现有的worlfile_id值进行比较会产生很大的开销,但我们的数据集很小,每天仅在凌晨1:30插入一次新数据,而且,将重复的工作文件_id搜索保留到最近6个月内插入的行也是可行的

是否可以在列workfile_id中查找重复项并在该工作文件_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 ;

很难知道触发器是否工作正常,或者触发器中的代码是否工作正常。我在插入时没有错误。有没有办法调试触发器错误?

好吧,一切都有可能

您不控制数据集,但可以修改数据库,对吗? 然后,您可以在每次插入新值后使用触发器,并在重复时更新它。比如:

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;
如果一天只有一个insert,并且在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 ;

希望这有帮助。

如果需要将值添加为2位数字,则可以使用类似SET@COUNTER=CONCAT“0”和@COUNTER;然后设置@COUNTER=SUBSTR@COUNTER,长度@COUNTER-1;,在更新您的_表之前。。。指示这很凌乱,但应该能奏效。干杯,如果我不清楚,我很抱歉。我完全控制目标数据库。我不是db管理员,所以我不清楚这样的事情是如何实现的。我今天忙得不可开交,但我会尽快测试你的方法,如果成功的话,我会选择正确的方法。谢谢你的快速回复。嗨!我仔细检查了一下,看是否更正了这个问题。顺便问一下,表中的字段都是这样吗?或者您是否有标识每行的unike id?我的意思是,像一个自动递增的值。。因为这是正常工作所必需的。让我知道。对不起,不,这些不是全部字段。我只是想保持简单。我有一个唯一的id字段是自动递增的。我已经用你更新的代码更新了我的触发器,现在我正在测试它。祝你好运,太好了!然后必须在where子句中设置该ID;其中unique\u id=NEW.unique\u id。否则它将更新包含工作文件\u id值的所有字段。