回答編集履歴

3

コメントに基づき訂正

2023/11/22 00:28

投稿

ikedas
ikedas

スコア4364

test CHANGED
@@ -47,5 +47,7 @@
47
47
  ```
48
48
  できているようです。期待した通り、既存行 (id=1) と追加された行 (id=4, 5) のidが出力されています (個人的にはUPDATEで実際には更新しない式を書いているのがちょっと気持ち悪いですが)。
49
49
 
50
- ただ、MySQLには (8.0以降でも5.7以前でも) 同様の機能はないようです。ほかにPostgreSQLでも9.6以降は[RETURNING句](https://www.postgresql.jp/document/pg960doc/html/dml-returning.html)を書けますがON DUPLICATE KEY UPDATEはないです。DB2も[データ変更文から結果セットを得る](https://www.ibm.com/docs/ja/db2/9.7?topic=prs-retrieval-result-sets-from-sql-data-change-statement)こと (Pipelined DMLというらしい) ができるようですがやはりON DUPLICATE KEY UPDATEのようなものはないです。つまり、ほとんどの場合はトランザクションを使うなどして複数文で実現するしかないでしょうし、そのほうが汎用性が高いと思います。
50
+ ただ、MySQLには (8.0以降でも5.7以前でも) 同様の機能はないようです。ほかにPostgreSQLでも9.6以降は[RETURNING句](https://www.postgresql.jp/document/pg960doc/html/dml-returning.html)を書け~~ますがON DUPLICATE KEY UPDATEはないです~~、9.5以降でON DUPLICATE KEY UPDATEと同様の効果のある[ON CONFLICT DO UPDATE](https://www.postgresql.jp/document/pg950doc/html/sql-insert.html)句が書けます。DB2も[データ変更文から結果セットを得る](https://www.ibm.com/docs/ja/db2/9.7?topic=prs-retrieval-result-sets-from-sql-data-change-statement)こと (Pipelined DMLというらしい) ができるようですがやはりON DUPLICATE KEY UPDATEのようなものはないです。つまり、ほとんどの場合はトランザクションを使うなどして複数文で実現するしかないでしょうし、そのほうが汎用性が高いと思います。
51
51
 
52
+ 2023-11-22 コメントに基づき訂正
53
+

2

他のDBMSについて加筆

2023/11/21 01:35

投稿

ikedas
ikedas

スコア4364

test CHANGED
@@ -47,5 +47,5 @@
47
47
  ```
48
48
  できているようです。期待した通り、既存行 (id=1) と追加された行 (id=4, 5) のidが出力されています (個人的にはUPDATEで実際には更新しない式を書いているのがちょっと気持ち悪いですが)。
49
49
 
50
- ただ、MySQLには (8.0以降でも5.7以前でも) 同様の機能はないようです。ほかにPostgreSQLでもRETURNING句を書けますがON DUPLICATE KEY UPDATEはないです。トランザクションを使うなどして複数文で実現するしかないでしょうし、そのほうが汎用性が高いと思います。
50
+ ただ、MySQLには (8.0以降でも5.7以前でも) 同様の機能はないようです。ほかにPostgreSQLでも9.6以降は[RETURNING句](https://www.postgresql.jp/document/pg960doc/html/dml-returning.html)を書けますがON DUPLICATE KEY UPDATEはないです。DB2も[データ変更文から結果セッを得る](https://www.ibm.com/docs/ja/db2/9.7?topic=prs-retrieval-result-sets-from-sql-data-change-statement)こと (Pipelined DMLというらしい) ができるようですがやはりON DUPLICATE KEY UPDATEのようなものはないです。つまり、ほとんどの場合はトランザクションを使うなどして複数文で実現するしかないでしょうし、そのほうが汎用性が高いと思います。
51
51
 

1

MariaDBのバージョンを明記

2023/11/20 08:31

投稿

ikedas
ikedas

スコア4364

test CHANGED
@@ -1,4 +1,6 @@
1
1
  MariaDB 10.5.0以降では[INSERT...RETURNING](https://mariadb.com/kb/en/insertreturning/)文というのがあり、「insertされたすべての行の指定した列を返す」(... returns the listed columns for all the rows that are inserted) とされています。一方でこの文にはON DUPLICATE KEY UPDATE句も書けるので、「insertされたすべての行」にupdateされた行も含まれるのなら期待通りの動作になりそうです。
2
+
3
+ 以下はMariaDB 10.6.12で確認しました。
2
4
 
3
5
  ```
4
6
  MariaDB [test]> select * from test_users;