15

ActiveRecordauto_incrementでフラグなしで主キーを作成することは可能ですか?

できない

create table :blah, :id => false

列に主キーインデックスを付けたいからです。ドキュメントを調べましたが、何も役に立ちませんでした。

auto_incrementなしで主キーを作成することは可能ですか?

4

6 に答える 6

12

これを試して?

create_table(:table_name, :id => false) do |t|
  t.integer :id, :options => 'PRIMARY KEY'
end
于 2009-10-18T17:12:09.163 に答える
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

私は誰かがこれを追跡するのに時間を費やすのを節約することを願っています...それがデータベースに何をするかをチェックせずに答えを使用する...滞在者またはジムの答えを使用した結果(私のバージョンの依存関係で) )は、移行は正常に実行されますが、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誰か

于 2013-07-31T02:00:40.783 に答える
6

それは私にとってはうまくいきませんでしたが、次のことはうまくいきました:

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

唯一の問題は、schema.rbでそれを失うことです。

于 2010-06-15T23:09:16.737 に答える
5

Rails 5の時点で自動インクリメントを無効にするには、単に渡すことができます

default: nil

例えば

create_table :table_name, id: :bigint, default: nil do |t|
  # ... fields ...
end
于 2018-04-23T09:59:57.797 に答える
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

そして、それはRails4.0.2とPostgresql9.3.2で実際に機能します。

于 2014-03-12T06:20:20.347 に答える
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

于 2018-09-22T12:10:53.003 に答える