使用 $wpdb->query 时如何获取最后插入或更新的行的 ID

问题描述 投票:0回答:1

我正在使用

$wpdb->query()
方法使用自定义查询在 WordPress 插件表中插入数据。我使用自定义查询,因为我需要运行重复密钥更新。使用此方法时,有没有办法检索最新插入或更新的行的 ID?

执行本机

$wpdb->insert()
$wpdb->replace()
时,ID 存储在
$wpdb->insert_id
变量中,但这似乎不适用于使用
$wpdb->query()
执行的查询。

想到的唯一替代方案是使用

$wpdb->replace()
或执行 SELECT 查询来获取表中最后一行的 ID,但是前一种解决方案意味着在发现重复键时在 INSERT 之前运行 DELETE,而后者很容易出现竞争条件。

这个问题还有其他可能的解决方案吗?

wordpress replace insert
1个回答
0
投票

您仍然可以在查询中使用 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() 与当前连接/会话相关,因此它不会受到竞争条件的影响,请放心使用它。

© www.soinside.com 2019 - 2024. All rights reserved.