不要那样做!EVER! 根本就别想这么做!
This WRONG解决方案可能看起来(实际上并不)适合您:
INSERT INTO lists VALUES ((SELECT max(id)+1 FROM lists),'KO','SPH', '5');
BUT,如果有人尝试与您同时插入,你们都会得到相同的结果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,并使用读提交事务),类似的东西(在 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
clause.