3. 完整性校验核心概念
在金融数据治理中,完整性是数据质量的“第一道防线”。如果数据本身不完整,后续的准确性校验、一致性比对都无从谈起。本节将系统讲解完整性的定义、三类核心约束(主键/外键、非空),以及记录缺失与字段缺失的识别方法,帮助你在实战中快速定位数据缺口。
一、完整性定义:数据“不缺斤少两”
数据完整性(Data Completeness)是指数据集合在记录层面和字段层面均无缺失,且实体之间的引用关系保持闭合。通俗地说,就是“该有的记录一条不少,该填的字段一个不空,该关联的关系一处不断”。
在金融场景中,完整性通常包含三个维度:
- 实体完整性:每张表必须有唯一标识(主键),且主键值非空、不重复。
- 参照完整性:外键值必须存在于被引用表的主键中,不能出现“孤儿记录”。
- 域完整性:关键字段(如金额、日期、客户号)不允许为空,且取值在合理范围内。
核心判断标准:完整性校验回答的是“有没有”的问题,而不是“对不对”的问题。例如,一笔交易记录缺少“交易金额”字段,属于完整性问题;而金额填成了负数,则属于准确性问题。
二、三类核心约束:主键、外键、非空
数据库层面的约束是保障完整性的第一道技术屏障。理解这三类约束,是设计校验规则的基础。
| 约束类型 | 作用对象 | 校验目标 | 典型金融场景 |
|---|---|---|---|
| 主键约束(PK) | 单表 | 唯一标识每条记录,非空且不重复 | 交易流水号、客户号、合约编号 |
| 外键约束(FK) | 表间关系 | 子表引用值必须存在于父表 | 交易表.客户号 → 客户表.客户号 |
| 非空约束(NOT NULL) | 字段 | 关键字段不允许为 NULL | 交易金额、交易日期、币种 |
下面是一段典型的建表语句,展示了三类约束如何落地:
CREATE TABLE trade (
trade_id VARCHAR(32) NOT NULL PRIMARY KEY, -- 主键约束
customer_id VARCHAR(32) NOT NULL, -- 非空约束
trade_amount DECIMAL(18,2) NOT NULL, -- 非空约束
trade_date DATE NOT NULL, -- 非空约束
currency CHAR(3) NOT NULL, -- 非空约束
CONSTRAINT fk_customer
FOREIGN KEY (customer_id)
REFERENCES customer(customer_id) -- 外键约束
);
实战提示:生产环境中,外键约束常因性能或分库分表被禁用,此时必须通过定期的“孤儿记录扫描”来补偿校验,不能默认数据库已帮你兜底。
三、记录缺失与字段缺失的识别方法
完整性缺失分为两类:记录缺失(行级)和字段缺失(列级)。两者的识别思路不同,需要分别设计校验规则。
1. 记录缺失识别
记录缺失的本质是“源端有、目标端没有”或“应到未到”。常用方法包括:
- 主键比对法:对源表和目标表的主键集合做差集运算,找出缺失的主键。
- 计数核对法:按业务日期、机构等维度统计记录数,与上游对账文件比对。
- 时间窗口扫描:检查某时间段内应有记录是否连续,识别“断档”。
-- 主键比对:找出目标表中缺失的交易
SELECT s.trade_id
FROM source_trade s
LEFT JOIN target_trade t ON s.trade_id = t.trade_id
WHERE t.trade_id IS NULL;
2. 字段缺失识别
字段缺失表现为 NULL、空字符串或占位符(如“-”“N/A”)。识别时需要区分“真缺失”和“业务允许为空”。
-- 统计关键字段的空值率
SELECT
COUNT(*) AS total_rows,
SUM(CASE WHEN trade_amount IS NULL THEN 1 ELSE 0 END) AS amount_null_cnt,
SUM(CASE WHEN currency IS NULL OR currency = '' THEN 1 ELSE 0 END) AS currency_null_cnt
FROM trade
WHERE trade_date = '2024-06-01';
常见误区:把空字符串当成有效值。在金融数据中,currency = '' 与 currency IS NULL 同样属于缺失,校验规则必须同时覆盖两者,否则会漏报。
四、案例复盘:某银行日终对账的完整性缺口
某银行在日终对账时发现,交易表当日记录数比上游核心系统少了 37 条。排查过程如下:
- 第一步:用主键差集比对,确认缺失的 37 个交易流水号。
- 第二步:检查这些流水号的客户号,发现其中 12 个客户号在客户表中不存在,属于外键断裂。
- 第三步:进一步检查发现,这 12 个客户是当日新开户,客户表同步任务延迟了 15 分钟,导致交易先到、客户后到。
- 第四步:剩余 25 条记录因“交易金额”字段为空被 ETL 过滤,属于非空约束未在源头拦截。
复盘结论:完整性校验不能只做单表检查,必须建立主键—外键—非空三层联动规则,并在 ETL 入口处设置“拒绝写入”策略,而不是事后补救。
通过本节的学习,你需要建立的核心认知是:完整性校验不是单一动作,而是“约束定义—缺失识别—规则联动”的闭环。主键、外键、非空三类约束分别守护不同的完整性维度,而记录缺失与字段缺失的识别方法则决定了你能否在第一时间发现数据缺口。