0

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

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

SELECT COUNT(1) FROM testtable

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

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

4

4 回答 4

5

如果可能,请切换到为您的 id 使用auto_increment列,并且不要担心 id 序列中的间隙。您自己的 id 生成实现可能会造成更大的伤害,尤其是从长远来看。

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

SELECT MAX(id) + 1 new_id 
  FROM Table1

注意:当发出此查询的多个并发会话可能获取相同的 id 并且您的后续会话将失败时,此查询可能会在重负载下INSERT失败。因此再次考虑使用auto_increment您的 id。

这是SQLFiddle演示

于 2013-08-14T21:06:50.413 回答
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)
于 2013-08-14T21:08:41.267 回答
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)
于 2013-08-14T21:45:46.847 回答
0
SELECT COUNT(*) from table

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

于 2013-08-14T21:04:52.343 回答