Последовательность продвижения / приращения в sqlite3 - PullRequest
1 голос
/ 20 ноября 2010

Я пытаюсь увеличить последовательность в sqlite3.

По сути, я использую последовательность в качестве ключа в другой системе, и у меня есть несколько БД, которые вызывают конфликты.

т.е. у меня есть 2 БД, которые создают записи с одинаковым порядковым номером.Они оба создают 15, которые я использую как ключ к другой системе.

Я бы хотел продвинуть одну из последовательностей БД, скажем, на 10 000, чтобы я перестал получать конфликты.

Отказ от ответственности: прежде чем вы начнете прыгать на меня, я знаю,не очень хороший дизайн, и он используется только для раннего прототипирования.Я планирую «обновить» до использования UUID, сгенерированного из последовательности и метки времени, в качестве моего ключа в будущем.Однако, пока я не выйду из «демонстрационного режима», я просто хочу исправить мою проблему с помощью строки SQL, если смогу.

Я пробовал update sqlite_sequence set seq = 2000 where name = 'XXXX'; , но, похоже, это не сработало.Я новичок в sqlite3, может быть, это что-то еще?

Ответы [ 4 ]

1 голос
/ 18 января 2011

Эта проблема, кажется, привлекает много внимания, поэтому я подумал, что выложу реальный код, который я использую, с минимальной очисткой.Это в моем файле seed.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 голосов
/ 01 декабря 2010

Итак, не уверен, что я делал неправильно раньше, но код, который я изначально вставил в свой вопрос, сейчас работает для меня.

update sqlite_sequence set seq = 2000 where name = 'XXXX';
0 голосов
/ 22 декабря 2010
Alter sequence sqlite_sequence
increment by 10000;
0 голосов
/ 27 ноября 2010

Позвольте мне понять это прямо (и нет, я не осуждаю).Это будет ваша последовательность событий:

  1. Соединение с DB1
  2. Соединение (или присоединение) DB2
  3. Ручное принудительное выполнение seq в sqlite_sequence в DB1 к некоторому новому значению(который, как вы знаете, уникален)
  4. Сделайте то же самое для sqlite_sequence в DB2
  5. Вставить в таблицу автоинкремента в DB1
  6. Вставить в таблицу автоинкремента в DB2

Если я ошибаюсь, пожалуйста, дайте мне знать, и я буду работать оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...