Как отключить auto_increment в Rails Active Record

Возможно ли создать первичный ключ без флага auto_increment в ActiveRecord?

Я не могу сделать

create table :blah, :id => false

потому что я хочу иметь индекс первичного ключа в столбце. Я посмотрел документацию, но не нашел ничего полезного.

Возможно ли создать первичный ключ без auto_increment?

Ответ 1

Попробуйте это?

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

Ответ 2

Хорошо, вопрос старый, и 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

Я надеюсь, что это спасет кого-то из траты времени, отслеживающего это, или, что еще хуже... используя ответ, не проверяя, что он делает с db... потому что результат использования ответа со мной или jim (с моими версиями зависимостей) заключается в том, что миграция выполняется нормально, но идентификаторы NULL разрешены, а дубликаты идентификаторов разрешены. Я не пробовал ответ Shep, потому что мне не нравится идея db/schema.rb быть непоследовательной (+1 к Shep для того, чтобы быть явным об этом недостатке, иногда это было бы Bad Thing)

Я не уверен в значении этого, но с этим решением mysql describe показывает его как первичный ключ, такой же, как AR-таблица со значением по умолчанию: 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 default: id он делает... так кажется mysql, по крайней мере для describe обрабатывает ненулевой уникальный индексный ключ в качестве первичного ключа

HTH кто-то

Ответ 3

Это не сработало для меня, но следующее:

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

Проблема только в том, что вы теряете ее в schema.rb.

Ответ 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.