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;

运行方式

  1. 连接测试库:mysql -u root -p test_db。
  2. 将上述脚本粘贴执行,或保存为 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);。