【问题标题】:ON DUPLICATE KEY UPDATE for specific index, or combined indicesON DUPLICATE KEY UPDATE 针对特定索引或组合索引
【发布时间】:2020-01-03 20:46:38
【问题描述】:

我有一个表,到目前为止,我们使用ON DUPLICATE KEY UPDATE 查询来填充和更新,初始插入的外键(booking_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;

我们现在需要引入UNIQUE 约束来防止special_number 重复。此查询将不再按预期运行,因为虽然在第一个 INSERTbooking_id 作为 FK 将是其各自表的唯一,special_number 仍然有可能发生冲突。因为它们是同时插入的,所以查询现在更新(如果存在)special_number。有什么理由坚持这种方法吗?

我已经将查询拆分为单独的分支,但是仍然可以只用一个来完成工作吗?我了解在这种情况下不存在 WHERE 子句,并且我无法合理化 IF 语句作为解决方案,因为我不希望对 UPDATE 的查询具有不正确或重复的值,因为我试图阻止更新错误的行,并返回拒绝信息,同时仍然能够编辑或更新special_number

这种保持这种方法的尝试是否不值得,或者说节省了时间?或者有没有办法指定 only DUPLICATE KEY 被使用?或者为booking_id FKspecial_number UNIQUE 索引的结合引入“唯一对”索引的方法?

或者我应该只是做单独的查询。

【问题讨论】:

  • ODKU 处理任何独特的违规行为。如果您必须对不同的可能违规有不同的反应(这不能使用 ODKU 处理),您可以使用存储过程并在其中使用复杂的检查逻辑。
  • 表上的唯一键有四种可能的情况:1)仅在booking_id列上的唯一索引,2)仅在special_number 列,3) booking_id 列上的唯一索引和 special_number 列上的另一个索引(两个单独的索引),4) booking_id 列上的唯一索引i>booking_idspecial_number 列。最后一个可能(或不能)解决您的情况。问题可能是,如果您想更改 booking_id 列或 special number 列而不更改另一列,您最终会在表中得到一个新行。
  • 使用上面的更新语句,如果其他列在原始行中不同,则不会更新它们。添加 VALUES() 在您希望使用 INSERT 值列表中的值更新的任何列周围。照原样,UPDATE 部分将保持值不变,因为更新的值来自重复行。

标签: mysql on-duplicate-key


【解决方案1】:

我最终选择了 Akina 建议的路线。因为其他建议并不能完全解决我希望处理的问题,以及 ODKU 的局限性,所以现在我只是将它拆分为单独的调用,并且很可能会回到存储过程中,如果需要。

【讨论】:

    猜你喜欢
    • 2014-09-29
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多