如果 PostgreSQL 中不存在密钥,我该如何插入?

Jon*_*nas 8 postgresql insert

我有一张桌子:

CREATE TABLE mytable (id SERIAL, name VARCHAR(10) PRIMARY KEY)
Run Code Online (Sandbox Code Playgroud)

现在我想向这个表中添加名称,但前提是它们不存在于表中,并且在这两种情况下都返回id. 我怎样才能用 PostgreSQL 做到这一点?

我已经看到了一些用于此的脚本,但是没有单个 SQL 语句可以执行此操作吗?

例如,我可以插入并返回id

INSERT INTO mytable (name) VALUES ('Jonas') RETURNING id
Run Code Online (Sandbox Code Playgroud)

它第一次工作并返回id。但是如果Jonas表中已经存在它会失败,但id即使插入失败我也想返回。这可能与PostgreSQL有关吗?

小智 8

Upsert 语句曾经计划用于 9.1,但已推迟到 9.2,因此在此之前,您唯一的选择是在插入之前测试该值是否已存在。

或者,如果您只想拥有一个唯一标识符,您可以简单地使用序列 + nextval。


如果你想创建一个函数来做到这一点,这应该让你开始:

CREATE OR REPLACE FUNCTION upsert_tableName(arg1 type, arg2 type) RETURNS VOID AS $$ 
DECLARE 
BEGIN 
    UPDATE tableName SET col1 = value WHERE colX = arg1 and colY = arg2; 
    IF NOT FOUND THEN 
    INSERT INTO tableName values (value, arg1, arg2); 
    END IF; 
END; 
$$ LANGUAGE 'plpgsql'; 
Run Code Online (Sandbox Code Playgroud)


a_h*_*ame 5

如果您使用的是 9.1,则有一种使用可写 CTE 的解决方法

http://xzilla.net/blog/2011/Mar/Upserting-via-Writeable-CTE.html