如何在Rails Active Record中关闭auto_increment

Jak*_*old 13 activerecord ruby-on-rails auto-increment

是否可以auto_incrementActiveRecord中创建没有标志的主键?

我做不到

create table :blah, :id => false
Run Code Online (Sandbox Code Playgroud)

因为我想在列上有主键索引.我查了一下文档,但没有找到任何有用的东西.

是否可以在没有auto_increment的情况下创建主键?

Jim*_*Jim 12

试试这个?

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

  • 这对我使用mysql2适配器和Rails 3.2.13不起作用 (4认同)

Bla*_*ler 7

好的,问题是旧的,OP没有指定版本.这些答案中没有一个对我有用这些版本:

mysql2 0.3.11
rails 3.2.13 
mysql 5.5
Run Code Online (Sandbox Code Playgroud)

我结束了这个:

class SomeMigration < ActiveRecord::Migration
  # emulate a primary_key column without auto-increment
  # the solution here is to use a non-null integer id column with a unique index
  # this is semantically different from PRIMARY KEY in mysql but not
  # _too_ functionally different, the only difference is that mysql enforces
  # no-more-than-one-primary-key but allows >1 unique index
  def up
    create_table :foobars, :id => false do |t|
      t.integer :id, :null => false
      t.string :name
    end
    add_index :foobars, :id, :unique => true
  end
end
Run Code Online (Sandbox Code Playgroud)

我希望节省一些人花时间跟踪这个,或者更糟......使用答案而不检查它对数据库的作用...因为使用sojourner或jim的答案的结果(使用我的依赖项版本) )是迁移运行正常但允许NULL ID,并允许重复的ID.我没有尝试Shep的答案,因为我不喜欢db/schema.rb不一致的想法(为了明确这个缺点,有时候这是一件糟糕的事情,给Shep +1.)

我不确定这个的重要性,但是使用这个解决方案,mysql将describe它显示为主键,与默认的AR表相同:id ...如:

AR默认表:id

+---------------------+--------------+------+-----+---------+----------------+
| Field               | Type         | Null | Key | Default | Extra          |
+---------------------+--------------+------+-----+---------+----------------+
| id                  | int(11)      | NO   | PRI | NULL    | auto_increment |
Run Code Online (Sandbox Code Playgroud)

表与我的解决方案:

+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id           | int(11)      | NO   | PRI | NULL    |       |
Run Code Online (Sandbox Code Playgroud)

这有点有趣,因为迁移与我的解决方案生成的SQL不包括"PRIMARY KEY"(当然)...但是AR默认:id它确实...所以它似乎是mysql,至少describe对待一个非空唯一索引键作为主键

HTH有人


小智 6

这不适合我,但以下做了:

create_table(:table_name, :id => false) do |t|
  t.column :id, 'int(11) PRIMARY KEY'
end
Run Code Online (Sandbox Code Playgroud)

唯一的问题是你在schema.rb中丢失了它.


Cur*_*Sam 5

要从 Rails 5 开始禁用自动增量,您可以简单地传递

default: nil
Run Code Online (Sandbox Code Playgroud)

例如

create_table :table_name, id: :bigint, default: nil do |t|
  # ... fields ...
end
Run Code Online (Sandbox Code Playgroud)