このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1274791771/650
#  SQLite3で 
#   
#  1 | aaa 
#  2 | bbb 
#  3 | ccc 
#  4 | ddd 
#  5 | eee 
#   
#  というテーブルから「3 ccc」を削除した時に自動で 
#   
#  1 | aaa 
#  2 | bbb 
#  3 | ddd 
#  4 | eee 
#   
#  みたいに修正する方法ってありますか? 
#  他のDBMSでの方法でも構わないので宜しくお願いします。 
#   

'節が削除された時、連続したidを自動で振り直す'(_テーブル名,_削除された順idならび) :-
        '節が削除された時idを自動で振り直す'(_テーブル名,_削除された順idならび,0),!.

'節が削除された時idを自動で振り直す'(_テーブル名,[_id1],Sub1) :-
        findall(_,テーブル構造(_テーブル名,_,_),L),
        最終節のidを得る(_テーブル名,L,Max),
        テーブル構造の生成(_テーブル名,L,_id_d,_id_a,P,Q),
        _id1_1 is _id1 + 1,
        '_id1と_id2にの間の節のidを振り直す'(_id1_1,Max,id_d,P,_id_a,Q,Sub1),!.
'節が削除された時idを自動で振り直す'(_テーブル名,[_id1,_id2|R],Sub1) :-
        findall(_,テーブル構造(_テーブル名,_,_),L),
        idを更新する節の現在のid範囲(_id1,_id2,_id_1,_id2_1),
        テーブル構造の生成(_テーブル名,L,_id_d,_id_a,P,Q),
        '_id1と_id2にの間の節のidを振り直す'(_id1_1,_id2_1,id_d,P,_id_a,Q,Sub1),
        Sub2 is Sub1 + 1,
        '節が削除された時idを自動で振り直す'(_テーブル名,[_id2|R],Sub2).

最終節のidを得る(_テーブル名,L,Max) :-
        L = [_id|R],
        P =.. [_テーブル名|L],
        findmax(_id,call(P),Max),!.

'_id1と_id2にの間の節のidを振り直す'(_id1,_id2,_id_d,P,_id_a,Q,Sub1) :-
        for(_id1,N,_id2),
        retract(P),
        _id_a is _id_d - Sub1,        
        assertz(Q),
        N = _id2,!.

テーブル構造の生成(_テーブル名,L,_id_d,_id_a,P,Q) :-
        L = [_|R],
        P =.. [_テーブル名,_id_d|R],
        Q =.. [_テーブル名,_id_a|R],!.

idを更新する節の現在のid範囲(_id1,_id2,_id_1,_id2_1) :-
        _id1_1 is _id1 + 1,
        _id2_1 is _id2 - 1,!.