このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/930
#  ・DBMS名とバージョン 
#  SQLite3 
#  ・テーブルデータ 
#  tbl1 tid(auto), name(text) 
#  tbl2 tid(int), sid(int) 
#  tbl3 sid(auto), tag(text),type(int) 
#   
#  ざっとこんな感じでnameに対して複数のタグを持っている 
#  といった感じのテーブルに対して、データを入れたいと思っています。 
#  で、バックアップがCSVで「name,tag...」という形式で大量にあるのですが、 
#  タグテーブルに無ければ追加、名前テーブルに追記、連結データを追加、 
#  と手数が思ってた以上に多いので、 
#  挿入の手数をもう少し減らせる手段とかありませんか? 
# 

'バックアップがCSV(「name,tag...」)の情報を追加する'(_バックアップCSVファイル) :-
        open(_バックアップCSVファイル,read,Instream),
        'Instreamの情報を追加する'(Instream),
        close(Instream).

'Instreamの情報を追加する'(Instream) :-
        at_end_of_stream(Instream).
'Instreamの情報を追加する'(Instream) :-
        get_line(Instream,Line),
        split(Line,[','],[_name|_tagならび]),
        テーブルに追加する(_name,_tagならび),
        'Instreamの情報を追加する'(Instream).

テーブルに追加する(_name,_tagならび) :-
        tbl1(_tid,_name),
        'tag情報をtbl3とtbl2に追加する'(_tid,_tagならび),!.
テーブルに追加する(_name,_tagならび) :-
        \+(tbl1(_tid,_name)),
        新しいtidを取得する(_tid),
        assertz(tbl1(_tid,_name)),
        'tag情報をtbl3とtbl2に追加する'(_tid,_tagならび).

'tag情報をtbl3とtbl2に追加する'(_tid,_tagならび) :-
        append(_,[_tag|R],_tagならび),
        新しいsidを取得する(_sid),
        assertz(tbl3(_sid,_tag)),
        assertz(tbl2(_tid,_sid)),
        R = [],!.

新しいtidを取得する(_tid) :-
        repeat,
        _tid is random(99999999) + 1,
        \+(tbl1(_tid,_)),!.

新しいsidを取得する(_sid) :-
        repeat,
        _sid is random(99999999) + 1,
        \+(tbl3(_sid,_)),!.