データを削除できるんだったら、
最初っからきれいに入れ直してもバチは当たらない気がするけど、
それでもデータを直したければ、
地道に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を返す