質問するログイン新規登録
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

1回答

964閲覧

PostgreSQLでupsertがうまく動作しません

hatsuzo

総合スコア56

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

1クリップ

投稿2019/04/11 03:05

0

1

いつもお世話になっております。
postgreSQLで同じ構造のテーブルに対して、同一キーが存在すればUpdate、
無ければinsert というよくある更新をSQLで実行しようとしています。
Ver9.5以降だとupsert命令が使えるそうですが、使用中の9.5では使えないそうなので、下記のように書いてみましたが、うまく動作しません。
INSER INTOの行でsyntaxエラーと出ます。

tempというテーブルからwrkというテーブルに更新を行うものです。
列はともにa,b,c,dでそのうち、a,bがプライマリーキーです。

sql

1WITH upsert AS 2(UPDATE wrk 3 SET c = temp.c, 4 d = temp.d 5 FROM temp 6 WHERE temp.a = wrk.a 7 AND temp.b = wrk.b 8 RETURNING (temp.a, temp.b)) 9INSERT INTO wrk 10 SELECT a, b, c, d 11 FROM temp 12 WHERE (a, b) NOT IN 13 (SELECT a, b FROM upsert);

何処が拙いのかアドバイスいただけたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

RETURNING (temp.a, temp.b)だと型が不明で、FROM upsert部分でエラーになっているかもしれません。
以下の様にRETURNING でテーブルを返却するようにしてみて下さい。

SQL

1WITH upsert AS( 2 UPDATE wrk 3 SET c = temp.c, 4 d = temp.d 5 FROM temp 6 WHERE temp.a = wrk.a 7 AND temp.b = wrk.b 8 RETURNING (wrk.*) 9) 10INSERT INTO wrk 11 SELECT a, b, c, d 12 FROM temp 13 WHERE (a, b) NOT IN 14 (SELECT a, b FROM upsert)

後は、wrkとtempの項目の並びが一致してないと実行時のエラーとなります。
その場合は、以下の様に対比する項目を明確にします。

SQL

1INSERT INTO wrk( 2 a, b, c, d 3)

因みに使用しているのが9.5なのに、upsertが使えないとはどういう事ですか?
upsertというコマンドは9.5以降にもありませんよ。
insert構文が拡張されてupsertと同等の事が出来るという事ですので。

投稿2019/04/11 03:39

編集2019/04/11 04:19
sazi

総合スコア25430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsuzo

2019/04/11 05:26

saziさん コメントありがとうございました。 おかげさまで無事解決しました。 ネット上では一つの列だけを返すサンプルが出ていて、それを参考にしたのですが、きちんと理解しないまま使っているとちょっとした応用問題も躓くようです。 upsert「命令」は確かにないですね。調べていて、簡単にできる方法というつもりで書いたのですが、語弊がありました。失礼しました。 どうも有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問