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;

运行与验证

  1. 执行建表与插入语句,确认 6 条记录写入成功。
  2. 执行统计 SQL,预期返回 null_event_id_count = 3(由给定数据唯一推出)。
  3. 执行明细 SQL,预期返回 3 行,event_id 均为 NULL,按 event_time 升序为 U002、U004、U006。
  4. 判定通过条件:统计值等于明细行数,且明细中每条 event_id 均为 NULL。若统计值大于 0,说明主键非空约束被破坏,需回溯上游写入逻辑。

常见问题

  • 不要用 event_id = NULL,SQL 中与 NULL 比较结果恒为 UNKNOWN,必须使用 IS NULL。
  • 若表中存在空字符串 '',它不等于 NULL,需按业务约定单独用 event_id = '' 检查。
  • 生产环境建议在 event_id 上增加 NOT NULL 约束,从源头阻止空主键写入。