gpt4 book ai didi

mysql - 是否可以通过 ON DUPLICATE KEY UPDATE 强制 Sequel 始终返回自动增量 id?

转载 作者:行者123 更新时间:2023-11-29 12:29:51 25 4
gpt4 key购买 nike

我正在使用 Sequel (4.x) 和 MySQL 5.5,开发一个写入量大的应用程序,主要执行 INSERT 并偶尔更新现有行。 Sequel 在 .insert() 操作之后返回一个 AUTO_INCRMENT id。

我目前在以下表达式中使用 .on_duplicate_key_update():

# Insert new row into cache_table, updating any columns that change
# on a key violation
id = DB[:table_name].on_duplicate_key_update.insert(
  col1: @col1,
  col2: @col2,
  created: nil,
  updated: nil
)

当新插入行或列的值发生更改时,这会将自动增量 id (LAST_INSERT_ID()) 返回到变量 id 中,但返回 如果没有修改列的值,则为 0

阅读MySQL docs ,我明白为什么。执行 MySQL INSERT...ON DUPLICATE KEY UPDATE 时,MySQL 无法可靠地返回已存在但未被 UPDATE< 更改的行的 AUTO_INCRMENT id/。文档建议使用 UPDATE 表达式,例如:

ON DUPLICATE KEY UPDATE `id` = LAST_INSERT_ID(`id`)

我真的很想避免在此特定应用程序中使用额外的SELECT。如何强制 Sequel 使用相同的行为,并始终返回行 id,即使没有任何实际更改?

最佳答案

可以使用 Sequel.function() method 使 Sequel 在 RDBMS 上执行函数

要执行 MySQL 的 native LAST_INSERT_ID() 并将列 id 作为其参数传递,请将列名称作为符号作为第二个参数传递:

Sequel.function(:last_insert_id, :id)

Dataset#on_duplicate_key_update method接受列的哈希值和要更新的新值,因此可以将 :last_insert_id 函数以及要更新的其他列的显式列表一起传递到此处:

id = DB[:table_name].on_duplicate_key_update(
# Call the native LAST_INSERT_ID()
id: Sequel.function(:last_insert_id, :id),
col1: @col1,
col2: @col2,
updated: nil
).insert(
col1: @col1,
col2: @col2,
created: nil,
updated: nil
)

此方法可靠地将 LAST_INSERT_ID() 返回到 id 中,无需执行 SELECT 查询。

注意:INSERT...ON DUPLICATE KEY UPDATE导致表的AUTO_INCRMENT值在以下情况下前进:如果表除 AUTO_INCRMENT 主键之外还包含任何其他 UNIQUE 索引,则行将被更新。这并不是 Sequel 特有的,只是使用 ON DUPLICATE KEY UPDATE 时的一般警告。

如果这是 Not Acceptable ,您可能需要采取单独的 SELECT 操作,而不是在 DB.insert() 返回 0< 时检索 id/.

关于mysql - 是否可以通过 ON DUPLICATE KEY UPDATE 强制 Sequel 始终返回自动增量 id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27727410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com