sqlite3中的advance / Increment Sequence

时间:2010-11-20 01:52:26

标签: sql ruby-on-rails sqlite sequence

我正在尝试在sqlite3中增加一个序列。

基本上,我正在使用序列作为另一个系统的密钥,而且我有多个DB会产生冲突。

即。我有2个DB都创建具有相同序列号的条目。它们都创建了一个15,我用它作为另一个系统的关键。

我想推进其中一个DB的序列,例如10 000,这样我就不会再发生冲突了。

免责声明:在你开始跳过我之前,我知道这不是一个好的设计,它只用于早期原型设计。我打算'升级'使用序列和时间戳生成的UUID作为我未来的密钥。但是,在我退出“演示模式”之前,我只想用一行SQL解决问题,如果可以的话。

我已经尝试了update sqlite_sequence set seq = 2000 where name = 'XXXX'; ,但它似乎没有做到这一点。我是sqlite3的新手,也许是别的什么?

4 个答案:

答案 0 :(得分: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 

答案 1 :(得分:0)

让我直截了当(不,我不是在判断)。这将是您的事件序列:

  1. 连接到DB1
  2. 连接(或附加)DB2
  3. 手动将DB1中sqlite_sequence中的seq强制为某个新值(您知道这是唯一的)
  4. 对DB2中的sqlite_sequence执行相同的操作
  5. 在DB1
  6. 中插入自动增量表
  7. 在DB2中的自动增量表中插入
  8. 如果我弄错了,请告诉我,我会在那里工作。

答案 2 :(得分:0)

所以,不确定之前我做错了什么,但我最初在我的问题中提出的代码现在正在为我工​​作。

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

答案 3 :(得分:0)

Alter sequence sqlite_sequence
increment by 10000;