是否可以在 ActiveRecord 中创建没有auto_increment
标记的主键?
我无法做到
create table :blah, :id => false
因为我想在列上有主键索引。我查了documentation但没有找到任何有用的东西。
是否可以在没有auto_increment的情况下创建主键?
答案 0 :(得分:12)
试试这个?
create_table(:table_name, :id => false) do |t|
t.integer :id, :options => 'PRIMARY KEY'
end
答案 1 :(得分:7)
好的,问题是旧的,OP没有指定版本。这些答案中没有一个对我有用这些版本:
mysql2 0.3.11
rails 3.2.13
mysql 5.5
我最终选择了这个:
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
我希望能节省一些人花时间跟踪这个问题,或者更糟糕的是...使用答案而不检查它对数据库的作用...因为使用sojourner或jim的答案的结果(使用我的版本)依赖项)是迁移运行正常但允许NULL ID,并允许重复的ID。我没有尝试Shep的答案,因为我不喜欢db / schema.rb不一致的想法(为了明确这个缺点,有时候这是一个坏事,所以+1给了Shep)
我不确定这个的重要性,但是使用这个解决方案,mysql describe
将它显示为主键,与具有默认值的id表相同:id ...如:
表格,AR默认值:id
+---------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
表格与我的解决方案:
+--------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
这有点有趣,因为迁移时使用我的解决方案生成的SQL不包含“PRIMARY KEY”(当然)...但是AR默认:id它确实...所以它似乎是mysql,至少for describe
将非null唯一索引键视为主键
HTH某人
答案 2 :(得分:6)
这对我不起作用,但以下情况确实如此:
create_table(:table_name, :id => false) do |t|
t.column :id, 'int(11) PRIMARY KEY'
end
唯一的问题是你在schema.rb中丢失了它。
答案 3 :(得分:4)
你可以创建一个这样的表:
class CreateUsers < ActiveRecord::Migration
def change
create_table :routers, { id: false } do |t|
t.integer :id
end
execute "ALTER TABLE routers ADD PRIMARY KEY (id);"
end
end
这在Rails 4.0.2和Postgresql 9.3.2中确实有效。
答案 4 :(得分:0)
要在Rails 5中禁用自动增量,您只需传递即可
default: nil
例如
create_table :table_name, id: :bigint, default: nil do |t|
# ... fields ...
end
答案 5 :(得分:0)
您可以在Rails 5中完成
create_table :blah, id: :integer do |t|
如果要更改主键列的名称,请传递primary_key参数:
create_table :blah, id: :integer, primary_key: :my_awesome_id do |t|
答案 6 :(得分:0)
def change
create_table :tablename do |t|
# t.string :fieldname
end
change_column :tablename, :id, :bigint, auto_increment: false
end
注意:由于Rails 5.1的默认主键是bigint。 http://www.mccartie.com/2016/12/05/rails-5.1.html
如果您想将4字节密钥从:bigint更改为:integer