2017-02-24 17 views
0

idを1000ずつ増やす必要があります。すでにテーブルにレコードがあります。 テーブルのシーケンスIDとリレーションシップを変更する方法は?

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

しかし、他のテーブルで

関係 order_idがあります:私は、移行を作成します。私もそれらを増やす必要がありますか?

どうすれば1000に増やすことができますか?

+0

を書くあなたは既に存在しているいくつかのレコードを持っていますか? –

+0

リレーションシップの順序が変更された場合、それはordersテーブルからidを取るだけです –

+0

すべてのリレーションでorder_idを変更する必要はありません –

答えて

0

あなたのコマンドで始まるシーケンスの値以外の値は増やさないでください。その値をnextvalにしたい場合は、代わりにRESTARTを使用する必要があります(下記の例を参照)。また、シーケンスの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 
関連する問題