Created
March 21, 2013 00:16
-
-
Save brent-hoover/5209701 to your computer and use it in GitHub Desktop.
Postgres Upsert Example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| CREATE OR REPLACE FUNCTION upsert_pets_SEL_name_A_tag_number_SET_name_A_tag_number("name_sel" character varying(255), "tag_number_sel" integer, "name_set" character varying(255), "tag_number_set" integer) RETURNS VOID AS | |
| $$ | |
| DECLARE | |
| first_try INTEGER := 1; | |
| BEGIN | |
| LOOP | |
| -- first try to update the key | |
| UPDATE "pets" SET "name" = "name_set", "tag_number" = "tag_number_set" | |
| WHERE "name" = "name_sel" AND "tag_number" = "tag_number_sel"; | |
| IF found THEN | |
| RETURN; | |
| END IF; | |
| -- not there, so try to insert the key | |
| -- if someone else inserts the same key concurrently, | |
| -- we could get a unique-key failure | |
| BEGIN | |
| INSERT INTO "pets"("name", "tag_number") VALUES ("name_set", "tag_number_set"); | |
| RETURN; | |
| EXCEPTION WHEN unique_violation THEN | |
| -- seamusabshere 9/20/12 only retry once | |
| IF (first_try = 1) THEN | |
| first_try := 0; | |
| ELSE | |
| RETURN; | |
| END IF; | |
| -- Do nothing, and loop to try the UPDATE again. | |
| END; | |
| END LOOP; | |
| END; | |
| $$ | |
| LANGUAGE plpgsql; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment