1. 风控用户表主键唯一性校验
任务说明
风控用户表 risk_user 以 user_id 作为业务主键,一旦出现重复会导致下游画像、名单、额度计算出现重复计数或错误关联。本案例用一条聚合 SQL 找出重复的 user_id 及其出现次数,并给出可复现的建表、造数与验证流程。
环境与依赖
- MySQL 5.7+ 或 8.x(其他支持
GROUP BY ... HAVING的数据库同样适用)。 - 具备建表、插入、查询权限的测试库。
核心 SQL
思路:按 user_id 分组计数,用 HAVING COUNT(*) > 1 过滤出重复项,并按重复次数倒序,便于优先处理问题最严重的 ID。
-- 校验:输出重复的 user_id 及重复次数
SELECT
user_id,
COUNT(*) AS dup_cnt
FROM risk_user
GROUP BY user_id
HAVING COUNT(*) > 1
ORDER BY dup_cnt DESC, user_id;
最小可复现验证
下面脚本创建表、插入含重复与不重复的样例数据,并执行校验 SQL。样例中 1001 出现 3 次、1003 出现 2 次,其余各 1 次。
CREATE TABLE risk_user (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
name VARCHAR(32) NOT NULL
);
INSERT INTO risk_user (user_id, name) VALUES
(1001, 'A'),
(1001, 'B'),
(1001, 'C'),
(1002, 'D'),
(1003, 'E'),
(1003, 'F'),
(1004, 'G');
SELECT
user_id,
COUNT(*) AS dup_cnt
FROM risk_user
GROUP BY user_id
HAVING COUNT(*) > 1
ORDER BY dup_cnt DESC, user_id;
运行方式
- 连接测试库:
mysql -u root -p test_db。 - 将上述脚本粘贴执行,或保存为
check_pk.sql后运行mysql -u root -p test_db < check_pk.sql。
预期输出与判定标准
基于给定样例数据,查询结果应为:
+---------+---------+
| user_id | dup_cnt |
+---------+---------+
| 1001 | 3 |
| 1003 | 2 |
+---------+---------+
- 通过:结果集为空,说明
user_id无重复,主键唯一性成立。 - 不通过:返回任意行,每行即一个重复 ID 及其重复次数,需按
dup_cnt从高到低排查数据来源。
常见问题
- 若表中
user_id允许为 NULL,NULL 会被归为同一组参与计数,需先确认业务是否允许空值。 - 数据量大时,建议在
user_id上建索引以加速分组:CREATE INDEX idx_user_id ON risk_user(user_id);。 - 校验通过后,可加唯一约束防止再次写入重复:
ALTER TABLE risk_user ADD UNIQUE (user_id);。