【发布时间】: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 重复。此查询将不再按预期运行,因为虽然在第一个 INSERT 上 booking_id 作为 FK 将是其各自表的唯一,special_number 仍然有可能发生冲突。因为它们是同时插入的,所以查询现在更新(如果存在)special_number。有什么理由坚持这种方法吗?
我已经将查询拆分为单独的分支,但是仍然可以只用一个来完成工作吗?我了解在这种情况下不存在 WHERE 子句,并且我无法合理化 IF 语句作为解决方案,因为我不希望对 UPDATE 的查询具有不正确或重复的值,因为我试图阻止更新错误的行,并返回拒绝信息,同时仍然能够编辑或更新special_number。
这种保持这种方法的尝试是否不值得,或者说节省了时间?或者有没有办法指定 only DUPLICATE KEY 被使用?或者为booking_id FK 和special_number UNIQUE 索引的结合引入“唯一对”索引的方法?
或者我应该只是做单独的查询。
【问题讨论】:
-
ODKU 处理任何独特的违规行为。如果您必须对不同的可能违规有不同的反应(这不能使用 ODKU 处理),您可以使用存储过程并在其中使用复杂的检查逻辑。
-
表上的唯一键有四种可能的情况:1)仅在booking_id列上的唯一索引,2)仅在special_number 列,3) booking_id 列上的唯一索引和 special_number 列上的另一个索引(两个单独的索引),4) booking_id 列上的唯一索引i>booking_id 和 special_number 列。最后一个可能(或不能)解决您的情况。问题可能是,如果您想更改 booking_id 列或 special number 列而不更改另一列,您最终会在表中得到一个新行。
-
使用上面的更新语句,如果其他列在原始行中不同,则不会更新它们。添加 VALUES() 在您希望使用 INSERT 值列表中的值更新的任何列周围。照原样,UPDATE 部分将保持值不变,因为更新的值来自重复行。