Ответ 1
Попробуйте это?
create_table(:table_name, :id => false) do |t|
t.integer :id, :options => 'PRIMARY KEY'
end
Возможно ли создать первичный ключ без флага auto_increment
в ActiveRecord?
Я не могу сделать
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
Я надеюсь, что это спасет кого-то из траты времени, отслеживающего это, или, что еще хуже... используя ответ, не проверяя, что он делает с 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 кто-то
Это не сработало для меня, но следующее:
create_table(:table_name, :id => false) do |t|
t.column :id, 'int(11) PRIMARY KEY'
end
Проблема только в том, что вы теряете ее в schema.rb.
Вы можете создать таблицу следующим образом:
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.