MySQL无主键时如何基于多字段避免重复数据插入?
解决办法
核心思路:添加联合唯一约束
MySQL的INSERT IGNORE语法不仅会忽略主键冲突,同样会处理**唯一约束(Unique Constraint)**导致的冲突。我们可以给表中作为去重依据的三个字段添加联合唯一索引,以此实现“当market_day、order_number、uid同时匹配时忽略插入”的需求。
步骤1:给表创建联合唯一索引
执行以下SQL语句,为iruda_trade.stock_order_abusing表添加包含market_day、order_number、uid的联合唯一索引:
ALTER TABLE iruda_trade.stock_order_abusing ADD UNIQUE INDEX idx_unique_order (market_day, order_number, uid);
这个索引会强制这三个字段的组合值在表中唯一,一旦有重复的组合尝试插入,就会触发唯一键冲突。
步骤2:保留原MyBatis插入逻辑
你现有的MyBatisINSERT IGNORE语句无需修改,当遇到上述唯一键冲突时,INSERT IGNORE会自动跳过该条数据的插入,不会抛出异常,也不会影响其他正常数据的插入流程。
可选替代方案:重复时更新数据(按需使用)
如果后续需要在遇到重复数据时更新现有记录,可将INSERT IGNORE替换为INSERT ... ON DUPLICATE KEY UPDATE,示例如下:
<insert id="insertStockOrderAbusingList" parameterType="java.util.List"> INSERT INTO iruda_trade.stock_order_abusing ( market_day, uid, stock_account_id, order_number, symbol, conclusion_quantity, order_type, created_at ) VALUES <foreach collection="list" item="item" index="index" separator=","> ( #{item.transactionDate}, #{item.uid}, #{item.stockAccountId}, #{item.transactionNumber}, #{item.symbol}, #{item.filledVolume}, #{item.transactionType}, #{item.clientTimeStamp} ) </foreach> ON DUPLICATE KEY UPDATE stock_account_id = VALUES(stock_account_id), symbol = VALUES(symbol), conclusion_quantity = VALUES(conclusion_quantity), order_type = VALUES(order_type), created_at = VALUES(created_at) </insert>
若仅需忽略重复数据,INSERT IGNORE的方式更简洁直接。
内容的提问来源于stack exchange,提问作者Jeong Yeongmin
相关产品推荐
相关产品推荐

