5

SQLiteデータベースにテーブルを作成すると、テーブルごとに個別のシーケンスが自動的に作成されます。

ただし、SQLiteデータベースのすべてのテーブルに1つのシーケンスを使用し、そのシーケンスの値(たとえば、)を設定する必要があります(つまり、シーケンスminの開始値とシーケンスが増分できる最大値を意味します)。maxmin=10000max=999999minmax

これはOracleデータベースで実行できることは知っていますが、SQLiteで実行する方法がわかりません。

これを行う方法はありますか?

4

2 に答える 2

5

残念ながら、これを行うことはできません。SQLiteは、特別なsqlite_sequenceサービステーブルの各テーブルのシーケンスを自動的に作成します。

また、どういうわけか、すべてのテーブルのソースとして単一のシーケンスを使用するように強制したとしても、期待どおりに機能しません。たとえば、PostgreSQLまたはOracleで、シーケンスを値sayに設定したが、テーブルがすでに値、、 ...で1行を埋めている場合、そのシーケンスをソースとして使用して新しい行を挿入しようとすると、一意の制約違反で失敗します。12

ただし、SQLiteでは、次のようなものを使用して手動でシーケンスをリセットした場合。

UPDATE sqlite_sequence SET seq = 1 WHERE name = 'mytable'

すでに行があります、、、1... 23新しい挿入の試みは失敗しませんが、このシーケンスに適切な自動インクリメント列の既存の最大値を自動的に割り当てるので、それは上昇し続けることができます。

このハックを使用してシーケンスの開始値を割り当てることができますが、ある値で増分を停止させることはできません(他の手段を使用して監視しない限り)。

于 2013-02-27T09:52:12.430 に答える
0

まず第一に、これは悪い考えです。

データベースクエリのパフォーマンスは予測可能性に依存し、インデックスのシーケンスをいじることによって、データベースエンジンを混乱させるオフセットを導入しています。

ただし、これを実現するために、既存のシーケンス番号以上の最小シーケンス番号を決定することができます。

SELECT MAX(seq) FROM sqlite_sequence

これは、各INSERTクエリの後に実行し、その後にすべてのテーブルのすべてのシーケンスを更新する必要があります。

UPDATE sqlite_sequence SET seq=determined_max
于 2015-08-28T14:05:51.367 に答える