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

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

新規登録して質問してみよう
ただいま回答率
85.35%
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

解決済

3回答

4059閲覧

postgresでカラムのデータに連番で設定されているものの途中に、データを挿入しそれ以降の値を再度連番に設定したい場合

momolength

総合スコア62

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クリップ

投稿2021/06/08 03:38

編集2021/06/08 03:54
idcategorynamesort_order
1fruitapple1
2fruitgrape2
3fruitorange3
4Vegetablescarrot4
5Vegetablesgarlic5

とした場合、sort_orderには任意で数字を設定します。
createの時点で連番にしたものですが、後々insert intoで追加しようと思いましたが、
3と4の間に新データを追加したい。

この場合、sqlでそれ以降のデータのsort_orderを自動的に連番にすることは可能ですか?どう書きますか?

期待結果

idcategorynamesort_order
1fruitapple1
2fruitgrape2
4fruitpeach3
3fruitorange4
5Vegetablescarrot1
6Vegetablesgarlic2

postgresです。

失礼しました、12:50追記ーーーーーーーーーーーーーーーーーーー
これは、カテゴリーの中でに限定することは可能ですか?

カテゴリーfruitの2と3の間に新データ(peach)を追加したい。

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

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

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

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

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

neko_the_shadow

2021/06/08 04:11

1. sort_orderは何の順番ですか? nameの昇順ですか? 2. sort_orderだけでなくidも変更しますか?
momolength

2021/06/08 05:30 編集

1 = そのデータをweb上で表示する際に参考にする順番です。 2 = いいえ。insertの時に自動で採番されます。 あくまでもこちらが任意で設定する値ですが、既に設定してある(連番に設定した。特別なことはしてない)ものに、追加で差し込みをしたいと。 2と3の間に、新しいデータを入れたい場合、このまま入れると 1 2 2 (3) 3 4 5 となりますよね。なので、後続の値を4 5 と自動でつけれたらなと思ったんです。 しかし、他の方の回答を見ていただければわかる通り、それほど自由度は高くないと。一つずつupdateもしくは +1 でしていくことが必要になるそうです。 これにいたっては今確認中です。
guest

回答3

0

sort_orderには任意で数字を設定します。
それ以降のデータのsort_orderを自動的に連番にすることは可能ですか?

設定するのか自動で行うかのどちらなのでしょう?

内容的にはcategory内での、name順をsort_orderで指定しているという事ですよね。
IDがserial値なら、category、sort_order、IDの順であれば良いように思います。

SQL

1order by category, sort_order Nulls Last, ID

この状態であれば追加したものでsort_orderがnullならば後方に来ます。
その上で、並べ替えたい順があるなら、sort_order を更新すれば良いでしょう。

追記

データ投入に於いて、追加でデータ投入した場合の、sort_orderの値設定という話なら、そもそも最初に投入したデータのsort_orderはどうやって決めたの?って話ですから、元になるデータを作成した上で、それを元に追加・更新という事になるかと思います。

投稿2021/06/08 04:44

編集2021/06/08 04:59
sazi

総合スコア25327

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

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

m.ts10806

2021/06/08 04:47

Nulls 〜 なんてオプションあるんですね。これは良いことを聞いた。 大抵こういうのって整数でnull許容せず重複出さないように制御する設計にしてましたけど、これはこれで使い道がありそう。
m.ts10806

2021/06/08 04:59

おお!ありがとうございます。
guest

0

ベストアンサー

データを削除できるんだったら、
最初っからきれいに入れ直してもバチは当たらない気がするけど、
それでもデータを直したければ、
地道にUPDATE文を実行していけばいいと思う。

なお、SELECT文でのORDER BY句で決めた並び順が保てればいいんだろうから、
idの付け替えはしないようだし、
ふつうにUPDATE文やINSERT INTO文を、変更が必要なレコードidに対して行うだけですよ。

おすすめな方法として、トランザクション処理を加えます。

sql

1BEGIN; -- トランザクション開始 2 SELECT id, category, name, sort_order FROM テーブル名 ORDER BY category, sort_order; -- 変更前の状態を表示して記録 3 UPDATE テーブル名 SET name = 'carrot', sort_order = 1 WHERE id = 4; 4 INSERT INTO テーブル名(id, category, name, sort_order) VALUES (6, 'Vegetables', 'garlic', 2); 5 UPDATE テーブル名 SET category = 'fruit', name = 'peach', sort_order = 3 WHERE id = 4; 6 SELECT id, category, name, sort_order FROM テーブル名 ORDER BY category, sort_order; -- 変更後の状態も表示して目視で比較する 7ROLLBACK; -- これで変更はなかったことになる(問題なければCOMMITに変える)

これで、変更前のテーブルと、変更後のテーブルを表示するので、
意図した内容になるのを確認したら、ROLLBACKをCOMMITに直して実行すれば反映されます。

ちまちまUPDATE文やINSERT INTO文やDELETE文を書くのが面倒なら、
一発truncate table文をやって、
COPY文で全レコード投入しなおせばいいです。
実行するSQL文をテキストファイルで作っておく前提で。

COPY


serial型の話だと思って、勘違いの回答をしてしまいました。
恥ずかしいけど残しておきます。

8.1.4. 連番型
9.16. シーケンス操作関数

serial型って、テーブル名とカラム名を伴ったシーケンスが定義されているので、
setval()を使って値を再設定すればいいです。

SELECT setval('foo', 42, false); 次のnextvalは42を返す

投稿2021/06/08 03:44

編集2021/06/08 05:12
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

m.ts10806

2021/06/08 03:46

途中に割って入れたあと振り直したいという要件に見えたのですが…
momolength

2021/06/08 04:06

はい。updateで変更すればいいんですが、これ数が増えた場合困るなと思って…。
m.ts10806

2021/06/08 04:09 編集

数が幾ら増えてもinsert1件なら発行するupdate文は1つです。
退会済みユーザー

退会済みユーザー

2021/06/08 04:11 編集

考えるのが面倒なら、truncateしてinsert intoもしくはcopyで。どうせ初期データ投入の段階でしょ、絶対レコード削除できないシビアな状況でなければ、ラクにやっていいんじゃないかな。
momolength

2021/06/08 04:19

絶対削除できないものなので、自動でできるものなのかと質問しました。 >地道にUPDATE文を実行 例えば100まであったとしたら、1つインサート後ほかの方が回答してくださっている、 set sort_order=sort_order+1 where sort_order > ? こいつの、whereにカテゴリーを指定してあげるだけでよさそうですか? こちらの回答ご覧なりましたか?これではなにか懸念点があるので、地道にとおっしゃいましたか?
退会済みユーザー

退会済みユーザー

2021/06/08 04:23

心配なら使うな、心配ならテストして使え、それだけです。 たまたまそのシチュエーションでの番号の振り直しには、たまたま使えるでしょう。 それを確認するためにも、UPDATE文の前後にSELECT文を置いて、変更後の様子を観察できるようにします。 そのために、BEGIN~ROLLBACKというやり方も示しました。 ROLLBACKすれば元に戻りますので、いくらでもSQLを試せます。
m.ts10806

2021/06/08 04:29

質問者さん 私も近いことを書いています。読まれましたか?心配ならupdateと同じ条件でselectを。 100%一発でなんて中々熟練者でもありえないし、なんなら先にバックアップ取ってもいいんじゃないでしょうか。
momolength

2021/06/08 04:59

ちょっと一旦落ち着いて考えますね。ありがとうございます。
guest

0

そのような高度なことは自動ではできません。
insert後にそのinsertしたsort_order以上の番号に1を足すUPDATE文を発行してください。

set sort_order=sort_order+1 where sort_order > ?

投稿2021/06/08 03:44

m.ts10806

総合スコア80875

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

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

momolength

2021/06/08 03:55

失礼しました。大事なことを書き忘れていました。追記しましたご確認お願いします。
m.ts10806

2021/06/08 03:57 編集

方針は変わりません。 where条件足せば良いです。
m.ts10806

2021/06/08 04:03

不安ならいきなりupdateかけず、先に対象のデータが取れるか同じwhere使ったselectで確認すると良いです。 これはupdateに限らずdeleteでも使える考え方。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問