Rails迁移创建表主键

时间:2011-01-22 18:31:37

标签: mysql optimization ruby-on-rails-3 migration

我正在编写一个迁移脚本来创建一个包含名为guidVARCHAR(25)的主键列的表。问题是我觉得我必须加倍努力才能一步到位。

如果我跑:

create_table(:global_feeds, :primary_key => 'guid') do |t|
  t.string :guid, :limit => 25
  t.text :title
  t.text :subtitle

  ...

  t.timestamps
end

我得到一个名为guid的主键的表,没有名为id的列(这就是我想要的)。但是,问题是guid列是INT(11),其中启用了自动增量功能。所以我必须再运行一个命令:

change_column :global_feeds, :guid, :string, :limit => 25

似乎有点费解,基本上必须运行两个SQL命令才能获得我认为应该可以实现的命令。

有关如何优化此项的任何建议吗?

5 个答案:

答案 0 :(得分:25)

在Rails 4中,你可以做到;

create_table :global_feeds, id: false do |t|
  t.string :guid, primary_key: true
 ...
end

答案 1 :(得分:20)

我想你正在使用mySQL,所以这是你可以试试的

create_table :global_feeds, {:id => false} do |t|
  t.string :guid
  t.text :title
  t.text :subtitle
  t.timestamps
end
execute "ALTER TABLE global_feeds ADD PRIMARY KEY (guid);"

如果您不在mySQL上,则应更改execute命令中的查询以使用您的数据库引擎。我不确定你是否可以在SQLite上做到这一点。并且不要忘记将此行放在global_feed.rb模型中的某处:

set_primary_key :guid

无论如何,当你坚持其惯例时,你将充分利用Rails。更改主键名称和类型可能不是一个好主意。

答案 2 :(得分:4)

您需要使用#column而不是#string。例如:

create_table(:global_feeds, :primary_key => 'guid') do |t|
  t.column :guid, "varchar(25)", :null => false
  ...
end

请注意,varchar类型不能移植到MySQL以外的数据库。

答案 3 :(得分:3)

这在Rails 3中是可行的。尝试:

  def self.up
    create_table(:signups, :id => false) do |t|
      t.string :token, :primary => true

查看这个要点,找出将UUID用作主键col的绝佳解决方案:https://gist.github.com/937739

答案 4 :(得分:1)

在Rails 5中,对于从@kakoni迁移ArgumentError: Index name '*' on table '*' already exists时出现问题rails db:setup的人,以下内容适用于我

create_table(:global_feeds, primary_key: :guid, id: false) do |t|
  t.string :guid
 ...
end

有关详情,请查看create_table