2017-02-24 26 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