Atitit 数据库重复数据产生原因与解决总结 目录 1. 原因 1 1.1. 缺少数据约束校验 1 1.2. 表关系关联设计错误 1 2. 约束种类 1 2.1. 分类 表级约束vs列级别约束 2

Atitit 数据库重复数据产生原因与解决总结

 

目录

1. 原因 1

1.1. 缺少数据约束校验 1

1.2. 表关系关联设计错误 1

2. 约束种类 1

2.1. 分类 表级约束vs列级别约束 2

3. Other 2

3.1.1. 表级约束,给多个字段联合约束 2

4. 解决法总结 2

4.1. 增加主键,外键 2

4.2. 增加unique索引 2

4.3. Trigger约束 实现检查约束 2

4.4. 关联limit1 3

4.5. distinct 3

4.6. 适当groupby 分组运算 配合聚合函数max等 3

4.7. 放弃表join,使用select字段udf join模式 3

4.8. Merge 融合语句(需要unique或union unique索引 3

 

 

  1. 原因

 

    1. 缺少数据约束校验
    2. 表关系关联设计错误

导致left join多条对应

  1. 约束种类
  • 非空约束(not null)
  • 唯一性约束(unique)
  • 主键约束(primary key) PK
  • 外键约束(foreign key) FK
  • 检查约束(目前MySQL不支持、Oracle支持)
    1. 分类 表级约束vs列级别约束

多列一般啊属于表级约束

外键约束(foreign key)FK只能是表级定义

 

  1. Other

联合约束 可以使用unique实现

-> unique(name,email)

联合约束,表示两个或以上的字段同时与另一条记录相等,则报错

      1. 表级约束,给多个字段联合约束

 

  1. 解决法总结

 

    1. 增加主键,外键
    2. 增加unique索引
    3. Trigger约束 实现检查约束

建议trigger仅仅trig,主体检查放入sp udf 方便测试。。

    1. 关联limit1 
    2. distinct
    3. 适当groupby 分组运算 配合聚合函数max等

 groupby  count配合having

思路, group by 分组可以对多个列进行分组, 分组后可以过滤掉重复的数据

 

count数查询出来了,那么count>1的自然是重复的数据 配合having

SELECT id,`name`,age,count(1) as c

FROM user GROUP BY `name`,age having c > 1

 

    1. 放弃表join,使用select字段udf join模式
    2. Merge 融合语句(需要unique或union unique索引
posted @ 2020-04-29 21:19  attilaxAti  阅读(53)  评论(0编辑  收藏  举报