ActiveRecordauto_increment
でフラグなしで主キーを作成することは可能ですか?
できない
create table :blah, :id => false
列に主キーインデックスを付けたいからです。ドキュメントを調べましたが、何も役に立ちませんでした。
auto_incrementなしで主キーを作成することは可能ですか?
ActiveRecordauto_increment
でフラグなしで主キーを作成することは可能ですか?
できない
create table :blah, :id => false
列に主キーインデックスを付けたいからです。ドキュメントを調べましたが、何も役に立ちませんでした。
auto_incrementなしで主キーを作成することは可能ですか?
これを試して?
create_table(:table_name, :id => false) do |t|
t.integer :id, :options => 'PRIMARY KEY'
end
さて、質問は古く、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
私は誰かがこれを追跡するのに時間を費やすのを節約することを願っています...それがデータベースに何をするかをチェックせずに答えを使用する...滞在者またはジムの答えを使用した結果(私のバージョンの依存関係で) )は、移行は正常に実行されますが、NULL IDが許可され、重複IDが許可されることです。db / schema.rbに一貫性がないという考えが気に入らないため、Shepの回答を試しませんでした(Shepにその欠点を明示するための+1、時にはそれが悪いことになる)
これの重要性はわかりませんが、このソリューションでは、mysqldescribe
はこれを主キーとして表示します。これは、デフォルトの:id...を使用したARテーブルと同じです。
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 | |
describe
私のソリューションでの移行によって生成されたSQLには「PRIMARYKEY」が含まれていないため、これは興味深いものです(もちろん)...しかし、ARのデフォルトでは:idが含まれています...主キーとしてのnull以外の一意のインデックス付きキー
HTH誰か
それは私にとってはうまくいきませんでしたが、次のことはうまくいきました:
create_table(:table_name, :id => false) do |t|
t.column :id, 'int(11) PRIMARY KEY'
end
唯一の問題は、schema.rbでそれを失うことです。
Rails 5の時点で自動インクリメントを無効にするには、単に渡すことができます
default: nil
例えば
create_table :table_name, id: :bigint, default: nil do |t|
# ... fields ...
end
次のようなテーブルを作成できます。
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
そして、それはRails4.0.2とPostgresql9.3.2で実際に機能します。
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