INTEGER PRIMARY KEYと設定した項目の抜け番を
INSERTで自動的に埋めていくにはどうしたらいいでしょうか?
【例】
id name
------------
1 山田
2 鈴木
4 佐藤
とあるときに、
INSERT INTO hoge VALUES(※ここの記述をどうするか…?)
で、idが3として新しく行が追加されるようにしたいのです。
INSERT INTO hoge SELECT MIN(id) + 1, 'ジュリアン' FROM hoge WHERE id + 1 NOT IN (SELECT id FROM hoge)
但し、この場合、「1番からの連番で1番が抜けている状態」の場合、id = 1 となるレコードは挿入されません。
空いている番号の内、最小の番号を見つけるには、例えば以下のようなSQLを書く必要があります。
insert into hoge select coalesce(min(rownum),(select max(id)+1 from hoge),1) as empty_id,'田中' from( select (select count(*) from hoge where id<=x.id) as rownum, id from hoge as x ) as y where rownum<id </pre>
すみませんが、教えていただいたSQL文は
僕には理解不能です。
where id<=x.id
の部分が…。
これは結局、
where id=id
ということになるんじゃないでしょうか?
SQLite では INTERGER PRIMARY KEY のカラムは指定しなければ勝手にユニークIDが付きますよ?
sqlite> create table t (id INTEGER PRIMARY KEY, value TEXT); sqlite> INSERT INTO t (value) VALUES ('abc'); sqlite> INSERT INTO t (value) VALUES ('123'); sqlite> INSERT INTO t (value) VALUES ('hogefuga'); sqlite> SELECT * FROM t; 1|abc 2|123 3|hogefuga
確かにその通りなのですが、
途中で抜け番があった場合、
それを埋めることなく最後の番号から
追加されていってしまいます。
1、2、4とある場合、次のレコードは
3ではなく5になってしまいます。
そこで、入れ替わりの激しいユーザーリストなどで
抜け番を再利用するために、ここで質問したわけです。
現在作成中のテーブルでは
id=1のレコードが削除されることはありませんので
これで十分です。
まずはしのぐことができます。
ありがとうございました!