2011-09-05 60 views
1

Rails喜欢使用自动增量32位整数作为表上的主键。当人们接近表格中32位整数行的限制时,他们做了什么?Rails Very Large表

+1

这是一个学术问题,还是你有一个超过40亿行的表? – DanSingerman

+0

@DanSingerman这不是一个学术问题。由于这个问题,我必须工作到凌晨2点:)有了大量的写入和删除操作,即使只有10几百万行,也很容易得到一个4字节的ID,这会导致各种各样的的问题。 –

回答

3

您可以将密钥更改为bigint?这是一个8字节(64位)整数。它可以提供高达9的量化,而不是40亿。没有一个本地迁移虽然,你必须做一些事情,如:

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

编辑场上as Alex suggested显然指定限制并允许在两个PostgreSQLmySQL bigints。

1

您可以使用8字节的ID字段。 Rails不提供创建长整型或双精度列的类型,但可以使用:limit参数完成:

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而不是默认值11. 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