我有一个Postgres表,其中包含用户信息,此表中的字段为:
id (int)
name (string)
我希望能够添加一个用户,并为他提供一个ID,该ID将从表中的当前值推迟:
将为添加的用户提供的ID应该是表中可用的最小值,即如果我有一个包含以下ID的表:1,3,4,5,8, 我希望用户的ID为2,下次我将添加一个用户,其ID将为6,下一个将为7,依此类推。
什么是正确的查询?
答案 0 :(得分:2)
以下选择查询可用于从表中找出遗漏的ids
SELECT t
FROM generate_series((
SELECT min(id) + 1
FROM tb
), (
SELECT max(id) + 1
FROM tb
)) t
WHERE NOT t IN (
SELECT id
FROM tb
)
ORDER BY t ASC
并且插入可以通过以下方式完成,
INSERT INTO tb
VALUES (
(
SELECT t
FROM generate_series((
SELECT min(id) + 1
FROM tb
), (
SELECT max(id) + 1
FROM tb
)) t
WHERE NOT t IN (
SELECT id
FROM tb
)
ORDER BY t ASC limit 1
)
,'B'
)
OR
创建一个像这样的函数
CREATE OR replace FUNCTION missed_id ()
RETURNS INTEGER AS $$
SELECT t
FROM generate_series((
SELECT min(id) + 1
FROM tb
), (
SELECT max(id) + 1
FROM tb
)) t
WHERE NOT t IN (
SELECT id
FROM tb
)
ORDER BY t ASC limit 1;;$$
LANGUAGE sql
并且插入应该是
insert into tb values (missed_id(),'B')
答案 1 :(得分:1)
$N1="any command";
$N2="any command";
exec("Rscript my_rscript.R $N1 $N2");
这是一个坏主意,如果你有同步插入
,它不是交易安全的