Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 对特定索引或组合索引进行重复键更新时_Mysql_On Duplicate Key - Fatal编程技术网

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语句,如果其他列在原始行中不同,则不会更新它们。在要使用“插入值”列表中的值更新的任何列周围添加值()。照原样,更新部分将保持值不变,因为更新的值来自重复行。