snippetsqlMinor
How can I insert if key not exist with PostgreSQL?
Viewed 0 times
postgresqlcaninsertwithexisthownotkey
Problem
I have a table:
Now I want to add names to this table, but only if they not exist in the table already, and in both cases return the
I have seen a few scripts for this, but is there no single SQL-statement to do it?
E.g. I can INSERT and return
it works the first time and returns
CREATE TABLE mytable (id SERIAL, name VARCHAR(10) PRIMARY KEY)Now I want to add names to this table, but only if they not exist in the table already, and in both cases return the
id. How can I do this with PostgreSQL?I have seen a few scripts for this, but is there no single SQL-statement to do it?
E.g. I can INSERT and return
id with:INSERT INTO mytable (name) VALUES ('Jonas') RETURNING idit works the first time and returns
id. But it fails if Jonas already exist in the table, but I want to return the id even if the Insert fails. Is this possible to do with PostgreSQL?Solution
Upsert statements used to be planned for 9.1 but have been postponed to 9.2, so until then, your only choice is to test if the value already exists before inserting.
Alternatively, if your intention is merely to have a unique identifier, you could simply use a sequence + nextval.
If you want to create a function to do that, this should get you started:
Alternatively, if your intention is merely to have a unique identifier, you could simply use a sequence + nextval.
If you want to create a function to do that, this should get you started:
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';Code Snippets
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';Context
StackExchange Database Administrators Q#5815, answer score: 8
Revisions (0)
No revisions yet.