将值插入表中,确定可用的最小值

时间:2015-12-14 10:12:42

标签: sql postgresql

我有一个Postgres表,其中包含用户信息,此表中的字段为:

id (int) 
name (string)

我希望能够添加一个用户,并为他提供一个ID,该ID将从表中的当前值推迟:

将为添加的用户提供的ID应该是表中可用的最小值,即如果我有一个包含以下ID的表:1,3,4,5,8, 我希望用户的ID为2,下次我将添加一个用户,其ID将为6,下一个将为7,依此类推。

什么是正确的查询?

2 个答案:

答案 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");

这是一个坏主意,如果你有同步插入

,它不是交易安全的