Jak*_*old 13 activerecord ruby-on-rails auto-increment
是否可以auto_increment在ActiveRecord中创建没有标志的主键?
我做不到
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)
好的,问题是旧的,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中丢失了它.
要从 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)
| 归档时间: |
|
| 查看次数: |
13268 次 |
| 最近记录: |