回答編集履歴

4

訂正

2019/02/05 08:38

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  DO UPDATE
18
18
 
19
- SET id=excluded.id, name=excluded.name, age=excluded.age
19
+ SET name=excluded.name, age=excluded.age
20
20
 
21
21
  ```
22
22
 

3

リンク先修正

2019/02/05 08:38

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -22,6 +22,6 @@
22
22
 
23
23
 
24
24
 
25
- [conflict_action](https://www.postgresql.jp/document/10/html/sql-insert.html)
25
+ [conflict_action](https://www.postgresql.jp/document/9.6/html/sql-insert.html)
26
26
 
27
27
  > conflict_actionではON CONFLICTの代替の動作を指定します。 これはDO NOTHINGあるいはDO UPDATE句のいずれかをとることができ、後者では競合が発生した場合に実行されるUPDATEの動作の正確な詳細を記述します。 ON CONFLICT DO UPDATEのSET句とWHEREは既存の行にテーブルの名前(または別名)を使ってアクセスでき、また**挿入されようとしていた行には、特別なexcludedテーブルを使ってアクセスできます。** excludedの列を読み取るときには、対象テーブルの対応する列のSELECT権限が必要です。

2

追記

2019/02/05 08:35

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -1,6 +1,8 @@
1
1
  エラー自体はSET構文中にFROMを使用しているからです。
2
2
 
3
3
  以下の様にexcludedで参照するように記述します。
4
+
5
+
4
6
 
5
7
  ```SQL
6
8
 
@@ -17,3 +19,9 @@
17
19
  SET id=excluded.id, name=excluded.name, age=excluded.age
18
20
 
19
21
  ```
22
+
23
+
24
+
25
+ [conflict_action](https://www.postgresql.jp/document/10/html/sql-insert.html)
26
+
27
+ > conflict_actionではON CONFLICTの代替の動作を指定します。 これはDO NOTHINGあるいはDO UPDATE句のいずれかをとることができ、後者では競合が発生した場合に実行されるUPDATEの動作の正確な詳細を記述します。 ON CONFLICT DO UPDATEのSET句とWHEREは既存の行にテーブルの名前(または別名)を使ってアクセスでき、また**挿入されようとしていた行には、特別なexcludedテーブルを使ってアクセスできます。** excludedの列を読み取るときには、対象テーブルの対応する列のSELECT権限が必要です。

1

修正

2019/02/05 08:34

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -1,6 +1,6 @@
1
1
  エラー自体はSET構文中にFROMを使用しているからです。
2
2
 
3
- 以下の様にselectで参照しているテーブルを参照するように記述します。
3
+ 以下の様にexcludedで参照するように記述します。
4
4
 
5
5
  ```SQL
6
6
 
@@ -14,6 +14,6 @@
14
14
 
15
15
  DO UPDATE
16
16
 
17
- SET id=test.id, name=test.name, age=test.age
17
+ SET id=excluded.id, name=excluded.name, age=excluded.age
18
18
 
19
19
  ```