我有一个sql查询,它只是向现有数据库表添加一行。第一个字段是id
,我假设必须在查询中指定此值。
那么id必须是现有的行数+ 1.我正在确定这样的id:
SELECT COUNT(1) FROM testtable
问题是这会返回已添加的行数,包括已删除的行数。因为我一直在这个表中添加和删除,所以这个数字大于表中我现在想要的行数。
如何计算表中现有的行而不是现有的+已删除的行?
答案 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)