我必须编写一个查询,其中我需要ID为特定记录分配一个(唯一密钥),该记录未被使用/未被生成/在数据库中不存在.
简而言之,我需要id为特定记录生成一个并在打印屏幕上显示它.
E. g.:
ID Name 1 abc 2 def 5 ghi
所以,问题是它应该ID=3作为尚未生成的下一个立即返回,并且在这一代之后id,我将把这些数据存储回数据库表.
它不是一个硬件:我正在做一个项目,我有一个要求,我需要编写这个查询,所以我需要一些帮助来实现这一目标.
所以请指导我如何进行此查询,或如何实现此目的.
谢谢.
我无法添加评论,这就是为什么我在这里写我的评论..我使用MySQL作为数据库..
我的步骤是这样的: -
1)从数据库表中检索未使用的id.
2)因为他们不是.用户(基于网站的项目),所以我不想发生并发,所以如果一个用户生成一个ID,那么它应该锁定数据库,直到同一个用户收到id并存储该id的记录.之后,其他用户可以检索不存在的ID.(主要要求)..
我怎么能在MySQL中实现所有这些东西,而且我认为Quassnoi的答案是值得的,但它不适用于MySQL ..所以plz解释有关查询的一点,因为它对我来说是新的..并且这个查询工作在MySQL ..
我把你的桌子命名了unused.
SELECT id
FROM (
SELECT 1 AS id
) q1
WHERE NOT EXISTS
(
SELECT 1
FROM unused
WHERE id = 1
)
UNION ALL
SELECT *
FROM (
SELECT id + 1
FROM unused t
WHERE NOT EXISTS
(
SELECT 1
FROM unused ti
WHERE ti.id = t.id + 1
)
ORDER BY
id
LIMIT 1
) q2
ORDER BY
id
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
此查询由两部分组成.
第一部分:
SELECT *
FROM (
SELECT 1 AS id
) q
WHERE NOT EXISTS
(
SELECT 1
FROM unused
WHERE id = 1
)
Run Code Online (Sandbox Code Playgroud)
选择a 1表格中没有条目id.
第二部分:
SELECT *
FROM (
SELECT id + 1
FROM unused t
WHERE NOT EXISTS
(
SELECT 1
FROM unused ti
WHERE ti.id = t.id + 1
)
ORDER BY
id
LIMIT 1
) q2
Run Code Online (Sandbox Code Playgroud)
选择id表中没有下一个的第一个id.
生成的查询选择这两个值中的最小值.
取决于你对"下一个id"的含义以及它是如何生成的.
如果您在数据库中使用序列或标识来生成id,那么"next id"可能不是3或4,而是在您呈现的情况下为6.您无法知道是否存在随后删除的id为3或4的值.序列和身份不一定试图回收差距; 一旦他们走了,你就不要重复使用它们.
因此,正确的做法是在数据库中创建一个序列或标识列,当您执行INSERT时会自动递增,然后选择生成的值.