Mysql计数没有删除

时间:2013-08-14 21:02:30

标签: php mysql sql database

我有一个sql查询,它只是向现有数据库表添加一行。第一个字段是id,我假设必须在查询中指定此值。

那么id必须是现有的行数+ 1.我正在确定这样的id:

SELECT COUNT(1) FROM testtable

问题是这会返回已添加的行数,包括已删除的行数。因为我一直在这个表中添加和删除,所以这个数字大于表中我现在想要的行数。

如何计算表中现有的行而不是现有的+已删除的行?

4 个答案:

答案 0 :(得分:5)

如果可能,请切换为使用auto_increment列作为您的ID,而不要关注ID序列中的间隙。你自己实现id生成可能会造成更大的伤害,特别是从长远来看。

现在,回到你眼前的问题。你可能正在寻找这个

SELECT MAX(id) + 1 new_id 
  FROM Table1

注意:当多个并发会话发出此错误时,此查询可能会在高负载下失败  查询可能会获取相同的ID,后续的INSERT将失败。因此,请再次考虑使用auto_increment作为您的身份。

这是 SQLFiddle 演示

答案 1 :(得分:2)

这是一个坏主意,因为你最终可能会有重复的ID,特别是如果你删除中间的行。如果您不打算使用自动增量字段,则可以将ID添加到插入中。只需使用它代替值:

((SELECT MAX(t.id) + 1 FROM table t)

完整的查询将是:

INSERT INTO table_name (id, col1, col2, col3) VALUES ((SELECT MAX(t.id) + 1 FROM table_name t), :col1, :col2, :col3)

答案 2 :(得分:0)

SELECT COUNT(*) from table

将仅返回其中的条目数,而不是基于ID

答案 3 :(得分:0)

还有可能通过选择第一个免费ID来找到并填补空白

SELECT MIN(t1.id + 1) AS free_id
FROM t1
WHERE NOT EXISTS (SELECT t2.id FROM t2 WHERE t2.id = t1.id + 1)