插入postgresQL

时间:2013-09-04 12:49:50

标签: sql postgresql insert

是否有办法在没有专门输入ID的情况下将新记录插入到没有自动增量ID的表中。我只想让ID为lastId + 1.

INSERT INTO lists VALUES (id,'KO','SPH', '5') //新ID

2 个答案:

答案 0 :(得分:6)

不要那样做!的 EVER 甚至不要考虑这样做!

这个错误解决方案似乎(它没有)为您效劳:

INSERT INTO lists VALUES ((SELECT max(id)+1 FROM lists),'KO','SPH', '5');

但是,如果有人尝试与您同时插入,则两者都会获得相同的id,这会导致无效结果。你真的应该使用sequence或更可靠的机制(当你不能在序列中有漏洞时,辅助表是常见的,但它有一些缺点[它会锁定])。您甚至可以使用serial数据类型使其更容易(它在下面创建一个序列):

CREATE TABLE lists(id serial, col2 text, col3 text, ...);
-- If you don't specify "id", it will autogenerate for you:
INSERT INTO lists(col2, col3, ...) VALUES('KO','SPH', ...);
-- You can also specify using DEFAULT (the same as above):
INSERT INTO lists(id, col2, col3, ...) VALUES(DEFAULT, 'KO','SPH', ...);

如果你真的,真的,真的,真的,不能创建和使用序列,你可以像上面那样做,但你必须处理异常(假设id字段是PK或UK,并且使用read committed transaction),类似的东西(在PL / pgSQL中):

DECLARE
    inserted bool = false;
BEGIN
    WHILE NOT inserted LOOP;
        BEGIN
            INSERT INTO lists
            VALUES ((SELECT coalesce(max(id),0)+1 FROM lists),'KO','SPH', '5');
            inserted = true;
        EXCEPTION
            WHEN unique_violation THEN
                NULL; -- do nothing, just try again
        END;
    END LOOP;
END;

但同样,我强烈建议你避免它:使用一个序列并且开心...... = D

另外,我知道这是一个例子,但在INSERT INTO子句上使用显式列列表。

答案 1 :(得分:0)

试试这个:

INSERT INTO lists VALUES
(
    (select coalesce(count(*),0) from lists) + 1,
    'KO','SPH', '5'
)

可替换地:

INSERT INTO lists VALUES
(
    (select coalesce(max(id),0) from lists) + 1,
    'KO','SPH', '5'
)

如果您不想指定ID,您的字段必须是自动增量。

如果使用guid作为id(序列),则必须指定字段,但该值由DBMS计算