人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQLiteでのSQL文について質問です。

INTEGER PRIMARY KEYと設定した項目の抜け番を
INSERTで自動的に埋めていくにはどうしたらいいでしょうか?

【例】
id name
------------
1 山田
2 鈴木
4 佐藤

とあるときに、
INSERT INTO hoge VALUES(※ここの記述をどうするか…?)
で、idが3として新しく行が追加されるようにしたいのです。

●質問者: sutara_lumpur
●カテゴリ:ウェブ制作
✍キーワード:hoge Key name SQL SQLite
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● JULY
●45ポイント

INSERT INTO hoge SELECT MIN(id) + 1, 'ジュリアン' FROM hoge WHERE id + 1 NOT IN (SELECT id FROM hoge)

但し、この場合、「1番からの連番で1番が抜けている状態」の場合、id = 1 となるレコードは挿入されません。

◎質問者からの返答

現在作成中のテーブルでは

id=1のレコードが削除されることはありませんので

これで十分です。

まずはしのぐことができます。


ありがとうございました!


2 ● chuken_kenkou
●70ポイント

空いている番号の内、最小の番号を見つけるには、例えば以下のような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

ということになるんじゃないでしょうか?


3 ● y-kawaz
●0ポイント

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になってしまいます。


そこで、入れ替わりの激しいユーザーリストなどで

抜け番を再利用するために、ここで質問したわけです。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ