mysql,postgresql插入操作遇到唯一键重复更新

本文探讨了在MySQL和PostgreSQL中处理数据插入时的冲突解决策略,包括使用ON DUPLICATE KEY UPDATE和ON CONFLICT DO UPDATE语句。同时,文章讨论了在批量插入数据时遇到的问题及可能的解决方案。

1.mysql的

<insert id="insertOrUpdateNew">
        insert into test
        (a,b,c)
        values
        (#{a},#{b},#{c})
        on duplicate key update
        c = values(c)
    </insert>

    <insert id="insertOrUpdateNewNew">
        insert into test
        (a,b,c)
        values
        <foreach collection="list" item="l" separator=",">
            (#{l.a},#{l.b},#{l.c})
        </foreach>
        on duplicate key update
        c = values(c)
    </insert>

2.postgresql

 <insert id="insertOrUpdateNew">
        insert into test
        (a,b,c)
        values
        (#{a},#{b},#{c})
        on conflict(a,b)
        do update set
        c = #{c}
    </insert>

    <insert id="insertOrUpdateNewNew">
        insert into test
        (a,b,c)
        values
        <foreach collection="list" item="l" separator=",">
        (#{l.a},#{l.b},#{l.c})
        </foreach>
        on conflict(a,b) do nothing
    </insert>

推荐下面:

    <insert id="insertOrUpdateNew">
        insert into test
        (a,b,c)
        values
        (#{a},#{b},#{c})
       on conflict(a,b) do update set c = excluded.c
    </insert>

postgresql插入的多条的话,总是报错....看网上也有人这样啊,难道版本原因,请大牛解答~

        insert into test
        (a,b,c)
        values
		(1,1,2),(1,1,3)
        on conflict(a,b) do update set c = excluded.c

 

### MySQL 插入更新操作详解 #### 1. 插入数据到表中 在 MySQL 中,`INSERT` 语句用于向数据库中的表插入新记录。以下是 `INSERT` 的基本语法: ```sql INSERT INTO table_name (column1, column2, ..., columnN) VALUES (value1, value2, ..., valueN); ``` 例如,可以使用以下 SQL 将一条记录插入名为 `teacher` 的表中[^5]。 ```sql INSERT INTO teacher (name, age) VALUES ('jack ma', 32); ``` 此命令会将名字为 `'jack ma'` 和年龄为 `32` 的教师信息插入到 `teacher` 表中。 #### 2. 更新现有数据 为了修改已存在的记录,可使用 `UPDATE` 语句。其标准形式如下所示: ```sql UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition; ``` 假设要更改 `id=1` 的教师的名字为 `'pony ma'` 并将其年龄设置为 `40`,则可以通过下述方式实现[^4]: ```sql UPDATE teacher SET name='pony ma', age=40 WHERE id=1; ``` 这里的关键部分是 `WHERE` 子句,它指定了哪些行应该被更新;如果没有指定条件,则整个表内的所有匹配列都会受到影响。 #### 3. 处理重复键冲突 - 使用 `ON DUPLICATE KEY UPDATE` 当尝试插入的数据违反了唯一约束(如主键或唯一索引),可以利用 `INSERT...ON DUPLICATE KEY UPDATE` 来优雅处理这种情况。该结构允许定义如果发现重复条目时应采取的动作[^1]。 考虑这样一个场景:我们希望增加团队成员数量而不覆盖原有数值。此时可以用这样的SQL语句完成任务: ```sql INSERT INTO teams (team_id, member_count, team_name) VALUES (4, 104, 'third') ON DUPLICATE KEY UPDATE member_count = member_count + VALUES(member_count); ``` 上述例子表明,在遇到具有相同 `team_id` 值的情况下,不是简单替换原来的记录而是累加新的成员数至现有的基础上去[^3]。 #### 4. 获取受影响的行或者返回结果集 – 利用 `RETURNING` 虽然 MySQL 自身并不支持直接像 PostgreSQL 那样拥有完整的 `RETURNING` 关键字功能,但在某些版本里可能提供了类似的机制来捕获由 DML 操作产生的变化详情。对于那些确实实现了这一特性的环境而言,它可以极大地简化应用程序逻辑并减少额外查询的需求[^2]。 注意实际应用过程中需确认当前使用的 MySQL 版本是否完全兼容此类特性以及具体行为表现可能会有所差异。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值