2010-11-20 60 views
1

我想在sqlite3中增加一个序列。sqlite3中的前进/增量序列

基本上,我使用的序列作为一个关键到另一个系统,我有多个数据库正在产生冲突。

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

我想提前DB的序列之一,比如说10 000,以便我不再发生冲突。免责声明:在你开始跳过我之前,我知道这不是一个好设计,它只用于早期原型设计。我计划将'升级'为使用序列和时间戳生成的UUID作为将来的密钥。但是,直到我退出“演示模式”,我只想用一行SQL来解决我的问题(如果可以的话)。

我试过update sqlite_sequence set seq = 2000 where name = 'XXXX';但它似乎没有办法。我是新来的sqlite3,也许这是别的?

+0

@MPelletier我认为这将是一个有效的方法,但似乎比我想象的要复杂一点。由于我只担心冲突,因此我认为我只需要更改其中的一个数据库 - 另一个可以从数据库的位置继续计数。我真的只想要一种方法来告诉序列'从10000开始计数'。 – 2010-11-28 16:05:00

回答

0

所以,不知道我以前做错了什么,但我最初放在我的问题中的代码现在正在为我工​​作。

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

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

  1. 连接到DB1
  2. 连接到(或附加)DB2
  3. 手动强制序列在DB1 sqlite_sequence一些新的值(你知道是唯一的)
  4. 执行相同的sqlite_sequence在DB2
  5. 插入在自动增量表中DB1
  6. 插入在自动增量表中DB2

如果我错了,请让我知道,我会从那里工作。

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 2011-10-18 22:27:15