2017-02-24 43 views
0

我需要增加id 1000.我已经在表格中有记录。我创建迁移:如何更改表中的序列标识和关系?

def change 
    execute("ALTER SEQUENCE orders_id_seq START WITH 1000") 
end 

但在其他表是有关系order_id。我还需要增加它们?

我该如何将它们增加到1000?

+0

你已经有目前一些记录? –

+0

如果订单关系的顺序发生了变化,它将仅从订单表中获得ID –

+0

您不需要在每个关系 –

回答

0

你不会增加任何东西,只是你的命令开始序列的值。如果您希望该值成为nextval,则必须改用RESTART(请参阅下面的示例)。另外 - 当您设置sequence的nextval时,您只更改id的下一个DEFAULT值,而不是之前的id值。为了提高id列的所有值,你必须像update relation set id=id+1000;

运行平稳下面就是比如你的说法做了什么:

t=# \x 
Expanded display is on. 
t=# create table so14(i bigserial); 
CREATE TABLE 
t=# select * from so14_i_seq; 
-[ RECORD 1 ]-+-------------------- 
sequence_name | so14_i_seq 
last_value | 1 
start_value | 1 
increment_by | 1 
max_value  | 9223372036854775807 
min_value  | 1 
cache_value | 1 
log_cnt  | 0 
is_cycled  | f 
is_called  | f 

t=# ALTER SEQUENCE so14_i_seq START WITH 1000; 
ALTER SEQUENCE 
t=# select * from so14_i_seq; 
-[ RECORD 1 ]-+-------------------- 
sequence_name | so14_i_seq 
last_value | 1 
start_value | 1000 
increment_by | 1 
max_value  | 9223372036854775807 
min_value  | 1 
cache_value | 1 
log_cnt  | 0 
is_cycled  | f 
is_called  | f 

t=# insert into so14 values(DEFAULT); 
INSERT 0 1 
t=# insert into so14 values(DEFAULT); 
INSERT 0 1 
t=# select * from so14_i_seq; 
-[ RECORD 1 ]-+-------------------- 
sequence_name | so14_i_seq 
last_value | 2 
start_value | 1000 
increment_by | 1 
max_value  | 9223372036854775807 
min_value  | 1 
cache_value | 1 
log_cnt  | 31 
is_cycled  | f 
is_called  | t 

t=# select * from so14; 
-[ RECORD 1 ] 
i | 1 
-[ RECORD 2 ] 
i | 2 

t=# ALTER SEQUENCE so14_i_seq RESTART WITH 1000; 
ALTER SEQUENCE 
t=# insert into so14 values(DEFAULT); 
INSERT 0 1 
t=# select * from so14; 
-[ RECORD 1 ] 
i | 1 
-[ RECORD 2 ] 
i | 2 
-[ RECORD 3 ] 
i | 1000 

t=# select * from so14_i_seq ; 
-[ RECORD 1 ]-+-------------------- 
sequence_name | so14_i_seq 
last_value | 1000 
start_value | 1000 
increment_by | 1 
max_value  | 9223372036854775807 
min_value  | 1 
cache_value | 1 
log_cnt  | 32 
is_cycled  | f 
is_called  | t 

t=# 
+0

我已经有'orders'表中的记录,我不更改'id'。因此,对于已建立的关系,我不会更改'order_id'?我什么都不碰 – dmitriy

0

要同步,你必须增加关联表的order_id记录。

增加id不是一个好主意。但对于解决方案,您可以像下面这样做。

创建迁移和编写代码

def change 
    AssociatedModel.all.each do |associated_object| 
    associated_object.order_id = associated_object.order_id + 1000 
    associated_object.save(validate: false) 
    end 
end