sql的方式实现插入表数据一样的更新,不一样的新增

sql的方式实现插入表数据一样的更新,不一样的新增

先有个场景 user表字段有姓名(name)、年龄(age)、头像(img)

还有一个集合的数据,要将集合中数据插入表中,姓名一样的更新

不一样的新增。目前表中没设主键

  • 单条数据的实现方式这里我们先讲 sql的实现方式 基于Oracle
  merge into user a
    using
    (
      SELECT
      'xuegao'as name,
      '25' as age,
      'd://pic/1.img' as img
      FROM dual
    ) b
    on (
    a.name= b.name   <!--name一样为更新新增的筛选条件-->
    )
    when matched then
    UPDATE   SET    <!--除name外字段更新-->
    a.age= b.age,
    a.img=b.img
    when not matched then
    INSERT(        <!--全部字段新增-->
    a.name,
    a.age,
    a.img
    ) VALUES(
    b.name,
    b.age,
    b.img
  • 这里我们讲讲多条数据一样的更新不一样的插入,应该怎么写。以mybatis 传入集合的方式
<!--xml层-->
<insert id="insertData" parameterType="java.util.List">
    merge into user a
    using
    (
    <foreach collection="list" index="index" item="item" open=""
             close="" separator="union all">
        SELECT
        #{item.age,jdbcType=VARCHAR} as age,
        #{item.img,jdbcType=VARCHAR} as img,
        #{item.name,jdbcType=VARCHAR} as name
        FROM dual
    </foreach>
    ) b
    on (
    a.name= b.name
    )
    when matched then
    UPDATE SET
    a.age= b.age,
    a.img= b.img
    when not matched then
    INSERT(
    a.name,
    a.age,
    a.img
    )

</insert>

我们举例以最少的字段,具体场景在上面增加字段即可,经测验这种写法有个小问题,当集合中的数据,name如果存在重复的话,都会插入到库中

  • 当然我们也可以通过后台处理的方式解决这个问题

    这里我们讲讲逻辑,可以通过单挑循环更新的方式,在表中进行更新,若返回值为0,则将此条数据新增,若返回值为1则不进行处理,这种是我考虑到的比较简单的一种解决方式大家如果有更好的方案欢迎留言讨论

在Python中,你可以使用pandas库来处理这个任务。pandas提供了一套强大的数据分析工具,其中包括数据清洗、比较和操作功能。以下是使用pandas操作数据库(假设是SQL数据库通过如`sqlite3`或`sqlalchemy`连接)来对比两张并记录差异的步骤: 1. 首先,加载数据到DataFrame,可以分别读取两张数据,例如: ```python import pandas as pd df1 = pd.read_sql_query("SELECT * FROM table1", connection) df2 = pd.read_sql_query("SELECT * FROM table2", connection) ``` 2. 比较两张同: ```python diff_df = df1.merge(df2, indicator=True, how='outer') # 添加了'result_type'列,标记哪些行来自哪一张 diff_df = diff_df[diff_df['result_type'] != 'both'] ``` 3. 确定哪些是新增、删除或更改的行: - 新增(只在df1中存在):`new_df = diff_df[df1['_merge'] == 'left_only']` - 删除(只在df2中存在):`del_df = diff_df[df2['_merge'] == 'right_only']` - 更新(在两都有,但在某一方有改动):`update_df = diff_df[(diff_df['_merge'] == 'both') & (df1.columns != df2.columns)]` 4. 将结果写入新的格: ```python for df in [new_df, del_df, update_df]: df['_diff_column_name'] = ['新数据', '已删除', '更新'][df['_merge']] # 假设 '_diff_column_name' 是你要添加的新列 df.to_sql('diff_table', con=connection, if_exists='append', index=False) # 插入到新的数据库 ``` 注意替换上述代码中的`table1`, `table2`, `column_name`等为实际的名和字段名,并根据需求调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值