【发布时间】:2019-02-23 14:45:45
【问题描述】:
我的一个小型数据库管理项目(用delphi编写)使用sql查询来查找mysql表的第一个空闲id。
示例:我必须在这样的表中找到第一个空闲 id(孔):
| id | Col1 |
|------|------|
| 5101 | ABC |
| 5102 | BCD |
| 5103 | CDE |
| 5105 | EFG | ???? first missing id
| 5106 | GHI |
| 5108 | ILM |
代码应该找到第一个空闲的id5104
这是我在 SQL 中的做法(在旧项目中):
SELECT
MIN((doc.id + 1)) AS nextID
FROM (doc
LEFT JOIN doc doc1
ON (((doc.id + 1) = doc1.id)))
WHERE (ISNULL(doc1.id) AND (doc.id > 5000))
现在,我正在用 c# 语言重写,我需要将 sql 语句转换为 LINQ 查询(它使用 Devart dotConnect for mysql Entity Framework)。 从这里开始:
DC db = new DC();
var nums = db.Documentos.OrderBy(x => x.Id);
【问题讨论】:
-
但是您需要它来添加具有这样值的行吗?还是为了其他目的?
-
我必须填写空行
-
如果您使用数据库生成的 ID,只需添加结果直到所需的 ID
-
这听起来像是一个 X/Y 问题。通常不会重复使用数据库 ID。使这种并发安全几乎是不可能的。您的 Db 是否仅供一次性使用?
-
您使用的是哪种类型的 LINQ?正如您在答案中看到的那样,人们很容易认为您可以在内存中完成这一切,但我很确定您希望数据库像使用 SQL 语句一样完成繁重的工作。