mybatis中使用MySql特有语法ON DUPLICATE KEY UPDATE,并使用联合索引禁止重复插入

6 篇文章 0 订阅

mybatis中使用ON DUPLICATE KEY UPDATE
注意:
ON DUPLICATE KEY UPDATE为Mysql特有语法,这是个坑;语句的作用,当insert已经存在的记录(主键重复、或者联合索引重复)时,执行Update

<insert id="insertInfo">
        insert into t_cust_
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id != null">
                id,
            </if>
            <if test="ip != null">
                ip,
            </if>
            <if test="status != null">
                status,
            </if>
            <if test="collectTime != null">
                collect_time,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="id != null">
                #{id,jdbcType=VARCHAR},
            </if>
            <if test="ip != null">
                #{ip, jdbcType=VARCHAR},
            </if>
            <if test="status != null">
                #{status,jdbcType=INTEGER},
            </if>
            <if test="collectTime != null">
                #{collectTime,jdbcType=TIMESTAMP},
            </if>
        </trim>
        ON DUPLICATE KEY UPDATE
            ip = VALUES(ip) ,
            status = VALUES(status) ,
            collect_time = VALUES(collect_time)
    </insert>

创建联合索引

alter table table_name add unique index index_key_name(Column_1,Column_2,...);

表内有重复数据后,如何创建联合唯一主键?使用ignore即可

alter ignore table table_name add unique index index_key_name(Column_1,Column_2,...);

但是在MySQL 5.7.4及以后就移除了对ignore的支持

As of MySQL 5.7.4, the IGNORE clause for ALTER TABLE is removed and its use produces an error.

在5.7.4之前的版本中,如果使用它,则会收到警告.就像是:

1 warning(s): 1681 ‘IGNORE’ is deprecated and will be removed in a future release.

所以还要先删除每组重复的信息并保留id最小的一条

DELETE 
FROM
	t_cust_
WHERE
	id NOT IN (
	SELECT
		id 
	FROM
		(
		SELECT
			MIN( id ) id,
			count( ip ) ip 
		FROM
			t_cust_
		GROUP BY
			ip,
			STATUS,
			collect_time 
		HAVING
			COUNT( ip ) >= 1 
		) temp 
	);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值