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