2. 风控事件表主键非空校验
任务说明
风控事件表 risk_event 以 event_id 作为主键,主键必须非空。本案例编写两条 SQL:一条统计 event_id 为空的记录数,一条列出这些空值记录的关键字段,用于定位数据质量问题。
环境与建表
使用任意支持标准 SQL 的数据库(MySQL / PostgreSQL / SQLite 均可)。下面先建表并插入含空值的测试数据,其中 3 条记录 event_id 为空。
CREATE TABLE risk_event (
event_id VARCHAR(32),
user_id VARCHAR(32),
event_type VARCHAR(32),
event_time DATETIME
);
INSERT INTO risk_event (event_id, user_id, event_type, event_time) VALUES
('E1001', 'U001', 'login', '2024-05-01 09:00:00'),
(NULL, 'U002', 'payment', '2024-05-01 09:05:00'),
('E1003', 'U003', 'login', '2024-05-01 09:10:00'),
(NULL, 'U004', 'withdraw','2024-05-01 09:15:00'),
('E1005', 'U005', 'payment', '2024-05-01 09:20:00'),
(NULL, 'U006', 'login', '2024-05-01 09:25:00');
校验 SQL
统计空值记录数:
SELECT COUNT(*) AS null_event_id_count
FROM risk_event
WHERE event_id IS NULL;
列出具体空值记录:
SELECT event_id, user_id, event_type, event_time
FROM risk_event
WHERE event_id IS NULL
ORDER BY event_time;
运行与验证
- 执行建表与插入语句,确认 6 条记录写入成功。
- 执行统计 SQL,预期返回
null_event_id_count = 3(由给定数据唯一推出)。 - 执行明细 SQL,预期返回 3 行,
event_id均为 NULL,按event_time升序为 U002、U004、U006。 - 判定通过条件:统计值等于明细行数,且明细中每条
event_id均为 NULL。若统计值大于 0,说明主键非空约束被破坏,需回溯上游写入逻辑。
常见问题
- 不要用
event_id = NULL,SQL 中与 NULL 比较结果恒为 UNKNOWN,必须使用IS NULL。 - 若表中存在空字符串
'',它不等于 NULL,需按业务约定单独用event_id = ''检查。 - 生产环境建议在
event_id上增加NOT NULL约束,从源头阻止空主键写入。