2011-09-05 6 views
1

레일은 자동 증가 32 비트 정수를 테이블의 기본 키로 사용하기를 좋아합니다. 테이블에있는 32 비트 int 행의 한계에 가까워지면 사람들은 무엇을합니까?레일 매우 큰 테이블

+1

학문적 질문입니까, 아니면 40 억 개가 넘는 행이있는 테이블이 있습니까? – DanSingerman

+0

@DanSingerman 학문적 인 질문이 아닙니다. 한 번만이 문제로 인해 2 시까 지 일해야했습니다 :) 쓰기 및 삭제 작업이 많아서 4 바이트 ID를 롤오버하는 것이 쉽지만 행 수가 10 억 개 밖에되지 않는 경우에도 모든 종류의 문제. –

답변

3

키를 bigint으로 변경할 수 있습니까? 이것은 8 바이트 (64 비트) 정수입니다. 그것은 40 억이 아니라 9 억까지 제공합니다.은 분명히 PostgreSQLmySQL 모두 bigints을 허용 않는 필드 as Alex suggested에 제한을 지정

execute("ALTER TABLE massive_table CHANGE id id BIGINT") 

편집 : 기본 이주는 당신이 뭔가를해야 할 것입니다,하지만이 없습니다.

1

8 바이트의 ID 필드를 사용할 수 있습니다. 제한 매개 변수 : 레일은을 사용하지만이 할 수있는, 긴 정수 또는 이중 정밀도 열을 생성하는 유형을 제공하지 않습니다

create_table :my_table do |t| 
    t.integer :long_int_column, :limit => 8 
    t.float :double_column, :limit => 53 
end 

8, 53 마법의 숫자입니다. 이 작업은 PostgreSQL 및 MySQL 데이터베이스에서 작동하지만 다른 작업은 시도하지 않았습니다.

테이블을 변경하는 경우에, 당신은

change_column :my_table, :my_col, :integer, :limit => 8 

8 바이트 ID 필드에 대한 대안은 어떤 방법으로 ID를 롤오버를 처리하는 것입니다 작성할 수 있습니다. 이는 데이터 및 애플리케이션의 특성에 달려 있습니다.

+1

int (8)는 8 바이트 필드가 아닙니다. 기본 너비 대신 숫자 너비를 8로 조정하는 것입니다. http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html int 필드는 항상 4 바이트입니다. – Gazler

+1

아니, 실제로 생성 된 열의 유형을 변경합니다. 이 게시물을 참조하십시오 : http://moeffju.net/blog/using-bigint-columns-in-rails-migrations –

+0

죄송합니다, 방금 이것을 테스트하고 당신은 절대적으로 맞습니다. 링크를 가져 주셔서 감사합니다. – Gazler