2010-11-20 7 views
1

Ich versuche, eine Sequenz in sqlite3 zu erhöhen.Advance/Increment Sequenz in sqlite3

Grundsätzlich verwende ich die Sequenz als Schlüssel in ein anderes System, und ich habe mehrere DB, die Konflikte erzeugen.

d. H. Ich habe 2 DBs, die beide Einträge mit der gleichen Sequenznummer erzeugen. Sie erstellen beide eine 15, die ich als Schlüssel zu einem anderen System verwende.

Ich würde gerne eine der DB-Sequenzen um, sagen wir 10 000, voranbringen, damit ich keine Konflikte bekomme.

Haftungsausschluss: Bevor Sie anfangen, über mich zu springen, weiß ich, dass dies kein gutes Design ist, und es wird nur für das frühe Prototyping verwendet. Ich plane, auf eine UUID zu aktualisieren, die in Zukunft aus der Sequenz und dem Zeitstempel als Schlüssel generiert wird. Aber bis ich nicht mehr im Demo-Modus bin, möchte ich einfach mein Problem mit einer SQL-Zeile beheben, wenn ich kann.

Ich habe versucht update sqlite_sequence set seq = 2000 where name = 'XXXX';, aber es scheint nicht den Trick zu tun. Ich bin neu bei sqlite3, vielleicht ist es etwas anderes?

+0

@MPelletier Ich denke, dass wäre ein gültiger Ansatz, aber scheint ein bisschen komplizierter als ich dachte, es wäre. Da ich mich nur um Konflikte sorge, denke ich, dass ich nur eine der Datenbanken ändern muss - die andere kann weiter zählen, wo sie ist. Ich möchte nur einen Weg, um die Sequenz 'Start Count von 10000' zu sagen. –

Antwort

0

Also, nicht sicher, was ich vorher falsch gemacht habe, aber der Code, den ich ursprünglich in meine Frage gestellt habe, funktioniert jetzt für mich.

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

Lassen Sie mich das klarstellen (und nein, ich beurteile nicht). Dies würde Ihre Abfolge der Ereignisse sein:

  1. Verbindung zu DB1
  2. Connect (oder anhängen) DB2
  3. manuell Kraft f in sqlite_sequence in DB1 bis zu einem gewissen neuen Wert (die Sie wissen, ist einzigartig)
  4. Sie
  5. das gleiche für sqlite_sequence in DB2
  6. Insert in autoincrement Tabelle in DB1
  7. Insert in autoincrement Tabelle in DB2

Wenn ich mich irre, lass es mich wissen, und ich werde von dort arbeiten.

0
Alter sequence sqlite_sequence 
increment by 10000; 
1

Dieses Problem scheint viel Aufmerksamkeit zu bekommen, so dass ich dachte, ich würde den eigentlichen Code schreiben Ich bin mit minimalem Schrubben mit. Das ist in meiner Datei samen.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

Ich habe diesen Code in meiner Antwort auf diese ähnliche Frage erweitert und bearbeitet: http://stackoverflow.com/questions/2097052/rails-way-to-reset-seed-on-id-field/7814519#7814519 – kikito