Mysql 对特定索引或组合索引进行重复键更新时
我有一个表,在此之前,我们在重复键更新上使用了一个Mysql 对特定索引或组合索引进行重复键更新时,mysql,on-duplicate-key,Mysql,On Duplicate Key,我有一个表,在此之前,我们在重复键更新上使用了一个查询来填充和更新,初始插入的外键(booking\u id)是更新案例的重复索引 INSERT INTO ship_docs (booking_id, boarding_date, shipping_date, special_number) VALUES (bookingId, boardingDate, shippingDate, specialNumber) ON DUPLICATE KE
查询来填充和更新,初始插入的外键(booking\u id
)是更新案例的重复索引
INSERT INTO ship_docs (booking_id, boarding_date, shipping_date, special_number)
VALUES (bookingId, boardingDate, shippingDate, specialNumber)
ON DUPLICATE KEY UPDATE
boarding_date = boardingDate, shipping_date = shippingDate, special_number = specialNumber;
我们现在需要引入一个唯一的
约束,以防止重复的特殊编号
。此查询将不再按预期运行,因为尽管在第一次INSERT
时,booking\u id
作为FK
对其各自的表是唯一的,特殊编号
仍有可能发生冲突。因为它们是同时插入的,所以查询现在会更新(如果存在)特殊编号
。有什么理由继续坚持这种方法吗
我已经将查询拆分为单独的分支,但是仍然可以只使用一个分支完成任务吗?我理解在这个场景中不存在WHERE
子句,我无法将IF
语句合理化为解决方案,因为我不希望查询使用错误或重复的值来UPDATE
,因为我试图防止在错误的行上更新,并返回拒绝信息,同时仍然能够编辑或更新特殊编号
这种试图保持这种方法的做法是否不值得获得好处,或者说不值得节省时间?或者有没有办法指定要使用的唯一的重复键
?或者介绍一种“唯一对”索引的方法,用于连接预订id FK
和特殊号唯一索引
或者我应该只是做单独的查询。我最终选择了Akina建议的路线。因为其他的建议并不能完全解决我希望解决的问题,以及ODKU的局限性,现在我只是将它分成几个单独的调用,如果需要的话,很可能会返回一个存储过程。我最终选择了Akina建议的路线。因为其他建议并不能完全解决我希望解决的问题,以及ODKU的局限性,所以现在我只是将其拆分为单独的调用,如果需要的话,很可能会使用存储过程返回到中。ODKU处理任何唯一的冲突。如果您必须对不同的可能违规行为有不同的反应(这不能使用ODKU处理),您可以使用存储过程并在其中使用复杂的检查逻辑。表上的唯一键有四种可能的情况:1)仅在booking_id列上有唯一索引,2)仅在special_number列上有唯一索引,3)booking_id列上的唯一索引与special_number列上的另一个索引(两个seprerate索引),4)booking_id和special_number列上的单个唯一索引。最后一个可能(或不是)解决你的情况。问题可能是,如果您想更改booking_id列或special number列而不更改另一列,则表中会出现新行。使用上面的update语句,如果其他列在原始行中不同,则不会更新它们。在要使用“插入值”列表中的值更新的任何列周围添加值()。照原样,更新部分将保持值不变,因为更新的值来自重复行。ODKU处理任何唯一的冲突。如果您必须对不同的可能违规行为有不同的反应(这不能使用ODKU处理),您可以使用存储过程并在其中使用复杂的检查逻辑。表上的唯一键有四种可能的情况:1)仅在booking_id列上有唯一索引,2)仅在special_number列上有唯一索引,3)booking_id列上的唯一索引与special_number列上的另一个索引(两个seprerate索引),4)booking_id和special_number列上的单个唯一索引。最后一个可能(或不是)解决你的情况。问题可能是,如果您想更改booking_id列或special number列而不更改另一列,则表中会出现新行。使用上面的update语句,如果其他列在原始行中不同,则不会更新它们。在要使用“插入值”列表中的值更新的任何列周围添加值()。照原样,更新部分将保持值不变,因为更新的值来自重复行。