質問: ![画像1](https://i.stack.imgur.com/POtbD.png) -------------画像1------------- 画像1のようにindexが1,2,3,4という順番で並んでいて 2行目の列を削除すると ![画像2](https://i.stack.imgur.com/w5yBV.png) -------------画像2------------- 画像2のようにindexが1,3,4となってしまうかと思うのですが ![画像3](https://i.stack.imgur.com/UqJ6r.png) -------------画像3------------- 画像3のように、 2のindexが削除されたら 3と4のindexを自動的に1つずつズレて 2と3にリネームされるようにしたいです。 そういった機能はPostgreSQLにはありますか? 無いとしたら、そういった機能を自分で作成しなくてはいけませんか? [追記] シーンの一覧画面を作る際、「scene_indexが5~10までのデータを取り出したい」 (5個ずつデータベースから取り出して、ページネーションを使って並べたい) というような場合があり、カラムを用意していないと取り出しにくいのではないかなと思い このような質問にさせていただきました。 scene_indexが歯抜け状態になっているデータベースからでも 指定した位置の前後5個のデータを取り出す、という処理が出来るのであれば それでも良いかと思うのですが、そういった方法があるかも分からなかったため このような質問をするに至っています。
回答: `scene_index` の値の順序が分かれば良いのであれば view を使う方法もあるかと思います。具体的には、以下の様にして view を作成します。 ``` # CREATE VIEW scene_view AS SELECT ROW_NUMBER() OVER (ORDER BY scene_index) AS nth, * FROM scene; # select * from scene_view; nth | scene_index | accountd | scene_name | created_date -----+-------------+----------+--------------+-------------- 1 | 1 | 120 | 初ステージ | 2013-06-22 2 | 2 | 59 | てすと | 2012-12-22 3 | 3 | 301217 | 作れたかな? | 2015-02-03 4 | 4 | 982 | あああ | 2014-08-22 (4 rows) # delete from scene where scene_index = 2; # select * from scene_view; nth | scene_index | accountd | scene_name | created_date -----+-------------+----------+--------------+-------------- 1 | 1 | 120 | 初ステージ | 2013-06-22 2 | 3 | 301217 | 作れたかな? | 2015-02-03 3 | 4 | 982 | あああ | 2014-08-22 (3 rows) # insert into scene values(0, 0, 'ゼロ', '1970/1/1'); # select * from scene_view; nth | scene_index | accountd | scene_name | created_date -----+-------------+----------+--------------+-------------- 1 | 0 | 0 | ゼロ | 1970-01-01 2 | 1 | 120 | 初ステージ | 2013-06-22 3 | 3 | 301217 | 作れたかな? | 2015-02-03 4 | 4 | 982 | あああ | 2014-08-22 (4 rows) ```