37509


[![画像1](https://i.stack.imgur.com/POtbD.png)](https://i.stack.imgur.com/POtbD.png)  
\-------------画像1-------------

画像1のようにindexが1,2,3,4という順番で並んでいて  
2行目の列を削除すると

[![画像2](https://i.stack.imgur.com/w5yBV.png)](https://i.stack.imgur.com/w5yBV.png)  
\-------------画像2-------------

画像2のようにindexが1,3,4となってしまうかと思うのですが

[![画像3](https://i.stack.imgur.com/UqJ6r.png)](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個のデータを取り出す、という処理が出来るのであれば  
それでも良い‌​かと思うのですが、そういった方法があるかも分からなかったた‌​め  
このような質問をするに至っています。


CC BY-SA 3.0
2017-08-26T05:03:22.903
37503
2017-08-26T22:22:38.990
2017-08-26T12:55:15.057
22541
22541
question
postgresql database
PostgreSQLで特定の行を削除した時に全体のindexをズラすには？


`scene_index` の値の順序が分かれば良いのであれば view を使う方法もあるかと思います。具体的には、以下の様にして view を作成します。

[code]

    # 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)
    
[/code]


CC BY-SA 3.0
2017-08-26T12:13:42.503
37509
2017-08-26T12:13:42.503
37503
answer


> scene_indexが5~10までのデータを取り出したい

であれば、`scene_index`の **値**
で絞り込むのではなく[LIMITとOFFSET](https://www.postgresql.jp/document/7.3/user/queries-
limit.html)を使用して5行目から6行を表す

[code]

    LIMIT 6 OFFSET 5
    
[/code]

を指定することで実現できますので、`scene_index`の値にこだわる必要はないかもしれません。


CC BY-SA 3.0
2017-08-26T13:05:20.853
37512
2017-08-26T22:22:38.990
2017-08-26T22:22:38.990
4236
4236
37503
answer