我正在使用
$wpdb->query()
方法使用自定义查询在 WordPress 插件表中插入数据。我使用自定义查询,因为我需要运行重复密钥更新。使用此方法时,有没有办法检索最新插入或更新的行的 ID?
执行本机
$wpdb->insert()
或 $wpdb->replace()
时,ID 存储在 $wpdb->insert_id
变量中,但这似乎不适用于使用 $wpdb->query()
执行的查询。
想到的唯一替代方案是使用
$wpdb->replace()
或执行 SELECT 查询来获取表中最后一行的 ID,但是前一种解决方案意味着在发现重复键时在 INSERT 之前运行 DELETE,而后者很容易出现竞争条件。
这个问题还有其他可能的解决方案吗?
您仍然可以在查询中使用 MySQL 的 LAST_INSERT_ID() 函数检索受影响行的 ID。
我不知道你的查询是什么样的,但这里有一个例子:
global $wpdb;
// Your data and query
$table_name = $wpdb->prefix . 'your_table';
$data = [
'column1' => 'value1',
'column2' => 'value2',
];
$unique_column = 'column1';
$id_column = 'id';
// Construct the query
$query = $wpdb->prepare(
"INSERT INTO $table_name (column1, column2)
VALUES (%s, %s)
ON DUPLICATE KEY UPDATE column2 = VALUES(column2), $id_column = LAST_INSERT_ID($id_column)",
$data['column1'],
$data['column2']
);
// Execute the query
$wpdb->query($query);
// Get the ID of the last inserted or updated row
$last_id = $wpdb->get_var("SELECT LAST_INSERT_ID()");
由于 LAST_INSERT_ID() 与当前连接/会话相关,因此它不会受到竞争条件的影响,请放心使用它。