我有一个 sql 查询,它只是将一行添加到现有的数据库表中。第一个字段是id
,我假设这个值必须在查询中指定。
那么 id 必须是现有的行数 + 1。我正在确定这样的 id:
SELECT COUNT(1) FROM testtable
问题是这会返回已添加的行数,包括已删除的行数。因为我一直在从这个表中添加和删除,所以这个数字大于我想要的表中现有行的数量。
如何计算表中的现有行而不是现有 + 已删除的行?
如果可能,请切换到为您的 id 使用auto_increment
列,并且不要担心 id 序列中的间隙。您自己的 id 生成实现可能会造成更大的伤害,尤其是从长远来看。
现在,回到你的直接问题。你可能正在寻找这个
SELECT MAX(id) + 1 new_id
FROM Table1
注意:当发出此查询的多个并发会话可能获取相同的 id 并且您的后续会话将失败时,此查询可能会在重负载下INSERT
失败。因此再次考虑使用auto_increment
您的 id。
这是SQLFiddle演示
这是一个坏主意,因为您最终可能会得到重复的 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)
也有可能通过选择第一个免费 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)
SELECT COUNT(*) from table
将仅返回其中的条目数,而不是基于 ID