我指望你在这方面的专业知识,我正在开发一个银行交易历史记录器。我的问题是,报废应该定期进行,银行不为每笔交易提供任何唯一标识字段,因此我需要找到一种不导入已导入数据的方法。如果不存在,我不能贪婪地导入,因为异常值可能会破坏应用程序的可靠性:
1) "01-01-2014", "ABCDEFG", "+100,00", "+1024,56"
2) "01-01-2014", "ABCDEFG", "-57,00", "+967,56"
3) "01-01-2014", "ABCDEFG", "-43,00", "+924,56"
4) "01-01-2014", "ABCDEFG", "+100", "+1024,56"
这里第一个和第四个是不同的操作,它们都应该导入到数据库中。我可能正在寻找一种考虑到整个导入数据序列的解决方案。关于如何可能有效地实现这一点的任何想法?!我正在使用 postgresql,这是我表的 DDL:
CREATE TABLE "extrato" (
"extrato_id" VARCHAR(4) PRIMARY KEY,
"linha" INTEGER NOT NULL
);
CREATE SEQUENCE linha_extrato_seq;
CREATE TABLE "linha_extrato" (
"linha_id" INTEGER PRIMARY KEY DEFAULT nextval('linha_extrato_seq'),
"dt_mov" DATE NOT NULL,
"dt_val" DATE NOT NULL,
"descricao" VARCHAR(60) NOT NULL,
"quantia" NUMERIC(10,2) NOT NULL,
"saldo" NUMERIC(10,2) NOT NULL,
);
ALTER SEQUENCE linha_extrato_seq OWNED BY linha_extrato.id;
正如 Craig Ringer 所说,缺少时间戳字段或唯一标识可能会破坏应用程序的可靠性,因此我正在尽我所能来减轻我拥有的“不完整”数据的影响。一个重要的细节是同步过程要经常进行,假设最后一次同步是在第 1 天,那么第二次同步将考虑从第 1 天开始往后的交易,因此如果存在则重叠总是发生在最后一次同步日期。
到目前为止,我对以下过程很难:
FOR first_row to last_row in to_insert
IF !exists(cur_row)
insert([cur_row,remaining_rows]);
break;
END IF
END FOR
这可以在 PL/pgSQL 中实现吗?我可以将一组插入作为一个独特的操作来处理吗?