我可以访问我们每天从云服务检索并存储在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上与其他表进行连接是有问题的,所以我想知道是否可以做以下两件事之一:
我的假设是每次插入数据时服务器将新的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 ;
很难知道触发器根本不工作,或者只是触发器中的代码不起作用。我没有插入错误。有没有办法调试触发器错误?
答案 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 ;
希望这有帮助。