質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

10687閲覧

PostgresでUPSERT処理を行いたい。

lifeguard

総合スコア16

PostgreSQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/02/05 07:52

前提・実現したいこと

test2 TBLにtest TBLの情報を流し込みたいです。
その際、重複するIDが存在しないレコードについてはINSERT、重複IDが存在するレコードについてはUPDATEを行うような処理をpostgresにて実行したいのですが、SQL実行時点でエラーが発生してしまい、上手く動作しませんでした。

test TBL,test2 TBLは下記条件にて作成しました。
test2 TBLの制約キーは[test2_pkey]です。

SQL

1CREATE TABLE test 2(id CHAR(4) NOT NULL,name TEXT NOT NULL,age INTEGER,PRIMARY KEY (id)); 3 4CREATE TABLE test2 5(id CHAR(4) NOT NULL,name TEXT NOT NULL,age INTEGER,PRIMARY KEY (id));

発生している問題・エラーメッセージ

エラーメッセージ ERROR: "FROM"またはその近辺で構文エラー LINE 7: FROM test AS T ^ SQL 状態:42601 文字:115

該当のソースコード

SQL

1INSERT INTO test2 2SELECT * 3FROM test 4ON CONFLICT ON CONSTRAINT test2_pkey 5DO UPDATE 6SET name = T.name,age = T.age 7FROM test AS T 8WHERE test2.id = T.id;

試したこと

エラーが発生している7行目周辺を色々と書き直してみましたが、改善されませんでした。

補足情報(FW/ツールのバージョンなど)

Postgres9.6

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

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

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

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

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

m.ts10806

2019/02/05 08:06

SQLの構文エラーを直すだけではあまり意味がないと思うので、サンプルデータのINSERT文もご提示いただけたらと
lifeguard

2019/02/05 08:11

情報が足らず申し訳ありません。 INSERT文に関しては、下記の通りです。 ご確認下さい。 ◆test TBL INSERT INTO test VALUES (1,'a',10),(2,'b',20),(3,'c',30); ◆test2 TBL INSERT INTO test2 VALUES (1,'aaa',1),(2,'bbb',2);
guest

回答1

0

ベストアンサー

エラー自体はSET構文中にFROMを使用しているからです。
以下の様にexcludedで参照するように記述します。

SQL

1INSERT INTO test2 2SELECT * 3FROM test 4ON CONFLICT ON CONSTRAINT test2_pkey 5DO UPDATE 6SET name=excluded.name, age=excluded.age

conflict_action

conflict_actionではON CONFLICTの代替の動作を指定します。 これはDO NOTHINGあるいはDO UPDATE句のいずれかをとることができ、後者では競合が発生した場合に実行されるUPDATEの動作の正確な詳細を記述します。 ON CONFLICT DO UPDATEのSET句とWHEREは既存の行にテーブルの名前(または別名)を使ってアクセスでき、また挿入されようとしていた行には、特別なexcludedテーブルを使ってアクセスできます。 excludedの列を読み取るときには、対象テーブルの対応する列のSELECT権限が必要です。

投稿2019/02/05 08:19

編集2019/02/05 08:38
sazi

総合スコア25173

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

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

lifeguard

2019/02/05 08:43

ご回答ありがとうございます。 SET構文中にFROMを使用していたことが原因だったということを理解しました。 また、excludedについての情報ありがとうございます。 こちらについても使用方法がよく分からなかったので、勉強させて頂きます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問