Androidでは、1つのテーブルを含むSQLiteデータベースを作成しました。このテーブルには、自動インクリメントIDカラムがあります。android SQLiteの自動インクリメント_idを減らすには?
私は4つのレコードがあるとします。これらのレコードをすべて削除すると、次に挿入されるレコードのIDは5番目のレコード(4
)ですが、このレコードを最初の位置(つまり0
)から挿入する必要があります。
どうすればこの問題を解決できますか?
Androidでは、1つのテーブルを含むSQLiteデータベースを作成しました。このテーブルには、自動インクリメントIDカラムがあります。android SQLiteの自動インクリメント_idを減らすには?
私は4つのレコードがあるとします。これらのレコードをすべて削除すると、次に挿入されるレコードのIDは5番目のレコード(4
)ですが、このレコードを最初の位置(つまり0
)から挿入する必要があります。
どうすればこの問題を解決できますか?
が編集:たぶん私はそれを明確にする必要があるだけで正しいIDの代わりに行を挿入しますシーケンス番号を操作する確かには以下の方法よりも良いアイデアです。テーブルにid = 3の行がない場合は、AUTOINCREMENTテーブルでもidに固定値を挿入するだけで済みます。あなたは本当に確信している場合は、あなたが使用して任意の値に自動インクリメント値を設定することができ、言っ
。
UPDATE sqlite_sequence set seq=<next sequence no -1> where name=<table name>;
つまり、テーブル 'TableA'の次の挿入時にAUTOINCREMENTで5を生成する場合は、そうします。
UPDATE sqlite_sequence set seq=4 where name='TableA';
seq
をリセットすると、あなたが期待するものとは異なるビットを振る舞い、それだけで生成された最低のidはseq + 1
の大きいとmax id still in the table + 1
であることを意味することに注意してください。
つまり、値> 5をすべて削除すると、シーケンス値を4にリセットし、次のシーケンス番号として5が生成されますが、テーブルにID 10がまだ残っている場合は、次の番号代わりにが11になります。
多分私はこの正確な動作がどこにも書かれていないことを指摘しておかなければならないかもしれないので、将来のバージョンのsqliteの動作には依存しません。それは今働く、それは明日ではないかもしれない。
ありがとうございます! –
この
delete from your_table;
delete from sqlite_sequence where name='your_table';
SQLiteのテーブルが今まで特別なSQLITE_SEQUENCEテーブルを使用して開催された最大のROWIDを追跡してみてください。 SQLITE_SEQUENCEテーブルは、AUTOINCREMENTカラムを含む通常のテーブルが作成されるたびに自動的に作成され、初期化されます。 SQLITE_SEQUENCEテーブルの内容は、通常のUPDATE、INSERT、およびDELETEステートメントを使用して変更できます。しかし、このテーブルを変更すると、AUTOINCREMENTキー生成アルゴリズムが混乱する可能性があります。あなたがそのような変更を行う前に、あなたがしていることを知っていることを確認してください。第五レコードを挿入する前に、あなたのテーブルで自動インクリメントの
リセット値:
SQLコマンド:
ALTER TABLE [tablename] AUTO_INCREMENT=[final value]
私はコマンドがMySQLだけだと思う、質問はSQLiteについてです。 –
ちょうど参照のために、あなたはそれを行う理由は何ですか? –
私はユーザー入力のデータを削除する必要があり、ユーザーはレコード番号を知っている必要があります! –
はい、ユーザーはユーザー番号を知ることができます。削除する直前にその行の情報を取得して保存し、その行を削除します。 – 5hssba