如何在数据库中获取下一个可用行ID,而不是最后一个?

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

我正在使用下面的代码来知道我的下一个帖子放在哪里。

// Create connection
$link = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

// Check connection
if($link === false){
    die("ERROR: Could not connect. " . mysqli_connect_error());
}

$sql = "SELECT * FROM `wp_posts` WHERE ID = (SELECT max(ID) FROM `wp_posts`)";
$res = $link->query($sql);
while( $rs = $res->fetch_object() ) {
            echo 'Last ID is: '. $rs->ID .' <br />';
            $lastID = $rs->ID;
        }

// Close connection
mysqli_close($link);

$ID_of_Next_Post = $lastID + 1;
echo 'Next post will go to ID: '. $ID_of_Next_Post .' <br />';

我面临的问题是,如果我写了一篇帖子,比如说,ID=100,然后我删除了那篇帖子,下一次调用这段代码的时候: $lastID 将仍然等于100,但是下一个帖子将进入102(因为101已经被占用了,即使它已经被删除并且不在那里了)。

所以我如何改变我的SQL查询来找到NEXT AVAILABLE id,这样我就知道下一个帖子会放在哪里?ID行被设置为自动递增,所以很想不设置帖子的ID,但是我需要知道ID是什么,这样我就可以在数据库的其他表中设置相互依赖关系。

php wordpress mysqli max id
1个回答
2
投票

也许你可以使用这个

select auto_increment from information_schema.TABLES 
where TABLE_NAME =’tablename’ and TABLE_SCHEMA=’database_name’;

如果你不想使用information_schema,那么你可以使用

SHOW TABLE STATUS LIKE 'table_name'

1
投票

首先要说明的是,最好是让自动增量来完成它的工作,把缺口留在那里。但是,如果你坚持要填满每一个可能的空隙,那么,你就会在 id-s,那么你可以这样做。

SELECT (CASE WHEN `wpm`.`min_id` = 1 THEN MIN(`u`.`id` + 1) ELSE 1 END) as next_id
FROM `wp_posts` wp
LEFT JOIN `wp_posts` wp2 ON `wp2`.`id` = `wp`.`id`+1
LEFT JOIN (SELECT MIN(id) as `min_id` FROM `wp_posts`) as wpm ON 1
WHERE `wp2`.`id` IS NULL

这将是一个配对 id-及其后的 id-s,并返回没有后续的最小值。id 在桌子上。因为这个性质。1 缺少的id是一种特殊情况,所以我们也要考虑到这一点。

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