teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

見直し

2021/06/08 05:12

投稿

退会済みユーザー
answer CHANGED
@@ -10,13 +10,13 @@
10
10
  おすすめな方法として、トランザクション処理を加えます。
11
11
 
12
12
  ```sql
13
- BEGIN;
13
+ BEGIN; -- トランザクション開始
14
- SELECT * FROM テーブル名 ORDER BY category, sort_order;
14
+ SELECT id, category, name, sort_order FROM テーブル名 ORDER BY category, sort_order; -- 変更前の状態を表示して記録
15
- UPDATE テーブル名 SET name = 'carrot', sort_order = 1 WHERE id = 4;
15
+ UPDATE テーブル名 SET name = 'carrot', sort_order = 1 WHERE id = 4;
16
- INSERT INTO テーブル名(id, category, name, sort_order) VALUES (6, 'Vegetables', 'garlic', 2);
16
+ INSERT INTO テーブル名(id, category, name, sort_order) VALUES (6, 'Vegetables', 'garlic', 2);
17
- UPDATE テーブル名 SET category = 'fruit', name = 'peach', sort_order = 3 WHERE id = 4;
17
+ UPDATE テーブル名 SET category = 'fruit', name = 'peach', sort_order = 3 WHERE id = 4;
18
- SELECT * FROM テーブル名 ORDER BY category, sort_order;
18
+ SELECT id, category, name, sort_order FROM テーブル名 ORDER BY category, sort_order; -- 変更後の状態も表示して目視で比較する
19
- ROLLBACK;
19
+ ROLLBACK; -- これで変更はなかったことになる(問題なければCOMMITに変える)
20
20
  ```
21
21
  これで、変更前のテーブルと、変更後のテーブルを表示するので、
22
22
  意図した内容になるのを確認したら、ROLLBACKをCOMMITに直して実行すれば反映されます。

4

加筆

2021/06/08 05:12

投稿

退会済みユーザー
answer CHANGED
@@ -21,6 +21,13 @@
21
21
  これで、変更前のテーブルと、変更後のテーブルを表示するので、
22
22
  意図した内容になるのを確認したら、ROLLBACKをCOMMITに直して実行すれば反映されます。
23
23
 
24
+ ちまちまUPDATE文やINSERT INTO文やDELETE文を書くのが面倒なら、
25
+ 一発truncate table文をやって、
26
+ COPY文で全レコード投入しなおせばいいです。
27
+ 実行するSQL文をテキストファイルで作っておく前提で。
28
+
29
+ [COPY](https://www.postgresql.jp/document/12/html/sql-copy.html)
30
+
24
31
  ---
25
32
 
26
33
  serial型の話だと思って、勘違いの回答をしてしまいました。

3

加筆

2021/06/08 04:09

投稿

退会済みユーザー
answer CHANGED
@@ -7,11 +7,19 @@
7
7
  idの付け替えはしないようだし、
8
8
  ふつうにUPDATE文やINSERT INTO文を、変更が必要なレコードidに対して行うだけですよ。
9
9
 
10
+ おすすめな方法として、トランザクション処理を加えます。
11
+
10
12
  ```sql
13
+ BEGIN;
14
+ SELECT * FROM テーブル名 ORDER BY category, sort_order;
11
15
  UPDATE テーブル名 SET name = 'carrot', sort_order = 1 WHERE id = 4;
12
16
  INSERT INTO テーブル名(id, category, name, sort_order) VALUES (6, 'Vegetables', 'garlic', 2);
13
17
  UPDATE テーブル名 SET category = 'fruit', name = 'peach', sort_order = 3 WHERE id = 4;
18
+ SELECT * FROM テーブル名 ORDER BY category, sort_order;
19
+ ROLLBACK;
14
20
  ```
21
+ これで、変更前のテーブルと、変更後のテーブルを表示するので、
22
+ 意図した内容になるのを確認したら、ROLLBACKをCOMMITに直して実行すれば反映されます。
15
23
 
16
24
  ---
17
25
 

2

見直し

2021/06/08 04:07

投稿

退会済みユーザー
answer CHANGED
@@ -1,3 +1,20 @@
1
+ データを削除できるんだったら、
2
+ 最初っからきれいに入れ直してもバチは当たらない気がするけど、
3
+ それでもデータを直したければ、
4
+ 地道にUPDATE文を実行していけばいいと思う。
5
+
6
+ なお、SELECT文でのORDER BY句で決めた並び順が保てればいいんだろうから、
7
+ idの付け替えはしないようだし、
8
+ ふつうにUPDATE文やINSERT INTO文を、変更が必要なレコードidに対して行うだけですよ。
9
+
10
+ ```sql
11
+ UPDATE テーブル名 SET name = 'carrot', sort_order = 1 WHERE id = 4;
12
+ INSERT INTO テーブル名(id, category, name, sort_order) VALUES (6, 'Vegetables', 'garlic', 2);
13
+ UPDATE テーブル名 SET category = 'fruit', name = 'peach', sort_order = 3 WHERE id = 4;
14
+ ```
15
+
16
+ ---
17
+
1
18
  serial型の話だと思って、勘違いの回答をしてしまいました。
2
19
  恥ずかしいけど残しておきます。
3
20
 

1

見直し

2021/06/08 04:04

投稿

退会済みユーザー
answer CHANGED
@@ -1,3 +1,6 @@
1
+ serial型の話だと思って、勘違いの回答をしてしまいました。
2
+ 恥ずかしいけど残しておきます。
3
+
1
4
  [8.1.4. 連番型](https://www.postgresql.jp/document/12/html/datatype-numeric.html#DATATYPE-SERIAL)
2
5
  [9.16. シーケンス操作関数](https://www.postgresql.jp/document/12/html/functions-sequence.html)
3
6