2010-11-20 10 views
1

sqlite3でシーケンスをインクリメントしようとしています。sqlite3の進歩/インクリメントシーケンス

基本的には、シーケンスをキーとして別のシステムに使用していますが、複数のDBで競合が発生しています。

つまり、2つのDBの両方が同じシーケンス番号を持つエントリを作成しています。彼らはどちらも私は別のシステムの鍵として使用する15を作成します。

私はDBのシーケンスの1つを、たとえば10000で進めて、競合の発生を止めたいと考えています。

免責事項:私が全部飛び降り始める前に、これは良いデザインではないことを知っています。初期のプロトタイプ作成にのみ使用されています。私は将来、私の鍵としてシーケンスとタイムスタンプから生成されたUUIDを使用するように「アップグレードする」ことを計画しています。しかし、私が「デモモード」を終了するまでは、できる限り私の問題をSQLの行で修正したいだけです。

私はupdate sqlite_sequence set seq = 2000 where name = 'XXXX';を試しましたが、そのトリックはしていないようです。私はsqlite3に新しいです、多分それは別のものですか?

+0

@MPelletier私はそれが有効なアプローチだと思っていますが、それは私が思っていたより少し複雑です。私は紛争だけを心配しているので、データベースのうちの1つを変更する必要があると思います。もう1つはデータベースの場所を数え続けます。私は本当にシーケンスを '10000から数え始める'と言う方法を欲しがっています。 –

答えて

0

私が以前に間違っていたことは分かりませんでしたが、最初は私の質問に入れたコードが今私のために働いています。

update sqlite_sequence set seq = 2000 where name = 'XXXX'; 
0

私はこれをまっすぐにしましょう(そして、いいえ、私は判断しません)。 DB2 (あなたが知っているユニークです)、いくつかの新しい値にDB1でsqlite_sequenceで

  • 手動力配列
    1. 接続DB1へ
    2. 接続する(または添付):これは、イベントのあなたの順序になります
    3. はDB2にsqlite_sequenceために同じことを行い
    4. DB1における自動インクリメント・テーブル内の
    5. 挿入
    6. DB2での自動インクリメント・テーブル内の
    7. 挿入

    私が間違っている場合は、私に知らせてください。私はそこから作業します。

    0
    Alter sequence sqlite_sequence 
    increment by 10000; 
    
    1

    この問題は、多くの注目を得ているように見えるので、私は、私は、最小限のスクラブを使用している実際のコードをポストだろうと思いました。これは私のseeds.rbファイルにあります。

    min_sequence = 1000 
    
    case ActiveRecord::Base.connection.adapter_name 
    when 'SQLite' 
        select_current_sequence_number_sql = "select seq from sqlite_sequence where name = 'businesses';" 
        set_min_sequence_to_ten_sql = "update sqlite_sequence set seq = #{min_sequence} where name = 'businesses';" 
        result = ActiveRecord::Base.connection.execute(select_current_sequence_number_sql) 
        result.nil? || result.empty? ? current_sequence_number = 0 : current_sequence_number = result[0]['seq'].to_i 
        if current_sequence_number < min_sequence 
        ActiveRecord::Base.connection.execute(set_min_sequence_to_ten_sql) 
        end 
    when 'PostgreSQL' 
    ... 
    else 
        raise "Task not implemented for this DB adapter" 
    end 
    
    +0

    このコードを私の答えで拡張して編集しました:http://stackoverflow.com/questions/2097052/rails-way-to-reset-seed-on-id-field/7814519#7814519 – kikito

    関連する問題