私は Python を使用して postgres データベースに書き込みます。
sql_string = "INSERT INTO hundred (name,name_slug,status) VALUES ("
sql_string += hundred + ", '" + hundred_slug + "', " + status + ");"
cursor.execute(sql_string)
しかし、一部の行が同一であるため、次のエラーが発生します。
psycopg2.IntegrityError: duplicate key value
violates unique constraint "hundred_pkey"
「この行がすでに存在しない限り INSERT」SQL ステートメントを記述するにはどうすればよいですか?
次のような複雑な文が推奨されているのを見たことがあります。
IF EXISTS (SELECT * FROM invoices WHERE invoiceid = '12345')
UPDATE invoices SET billed = 'TRUE' WHERE invoiceid = '12345'
ELSE
INSERT INTO invoices (invoiceid, billed) VALUES ('12345', 'TRUE')
END IF
しかし、まず、これは私が必要とするものに対して過剰でしょうか、そして第二に、どうすればこれらのいずれかを単純な文字列として実行できるのでしょうか?
ベストアンサー1
Postgres 9.5(2016年1月7日以降にリリース)では、「アップサート」コマンドとも呼ばれるINSERTのON CONFLICT句:
INSERT ... ON CONFLICT DO NOTHING/UPDATE
これは、他の回答で提案されている、同時操作を使用するときに発生する可能性のある微妙な問題の多くを解決します。