迁移中没有自动增量选项的id字段

时间:2009-02-05 20:55:41

标签: ruby-on-rails

我有像这样的数据库迁移:

 class CreateParticipations < ActiveRecord::Migration
      def self.up
        create_table(:participations, :primary_key => 'Seat')  do |t|      
          t.integer :Seat
          t.string :Nickname
          t.string :Clan
          t.string :FirstName
          t.string :LastName
          t.string :Email
          t.boolean  :Payed

          t.timestamps
        end
      end

      def self.down
        drop_table :participations
      end
    end

现在,座位是使用自动增量创建的。但是,我不希望这样。我希望它没有自动增量。我将在我的逻辑中定义Seat。

我一直在寻找,但我找不到如何禁用auto_increment。

我该怎么做?除了在MySQL中手动执行。

4 个答案:

答案 0 :(得分:17)

为了记录,如果你绝对需要这样做(它不应该经常发生),这里是使用Rails迁移DSL进行非自动增量主键的方法:

create_table(:table_name, :id => false) do |t|
  t.integer :id, :options => 'PRIMARY KEY'
end

无论如何,这将适用于MySQL,如果您的数据库使用不同的语法来指定主键,请将:options => 'PRIMARY KEY'替换为任何内容。

答案 1 :(得分:2)

这个问题已经有3年了,但是3年之后有人想知道,就像我一样,如果表格已经创建,你所做的只是“change_column”:

change_column(:table_name, :id, :integer, :null => false)

这应该适用于Rails 2.x和3.x。

0

答案 2 :(得分:0)

是否有理由不能使用rails的id键并手动添加名为Seat的索引?

我已经看到一些hacks只是为了在非增量pk数据库上运行-work-。我不认为这是一个选择。如果我记得,这就是rails访问其所有每行功能的方式。

老实说,怎么 - 绝对 - 你是否需要略微提高忽略导轨结构的效率?

我认为真正的答案是“你做不到”。 Activerecord有一些它不会屈服的东西。

答案 3 :(得分:0)

不是说它是一个好主意,但这里是我为SQLite3做的 - 只需用你的DB适配器替换SQLiteAdapter - 你可以通过调用define_method

来做得更干净/更短
class AbstractAdapter
end

module ActiveRecord
  module ConnectionAdapters
    class SQLiteAdapter < AbstractAdapter
      def supports_autoincrement?
        false
      end
    end
  end
end

<then you migration>

class SomeMigration < ActiveRecord::Migration
  def change
    create_table :table do |t|
      ActiveRecord::ConnectionAdapters::SQLiteAdapter.send :define_method, :supports_autoincrement? do false end
      t.integer etc
    end
  end
end

当然只需更改其他数据库的适配器