I've created a table without a primary key (:id => false), but now it has come back to bite my ass.
My app is already in production and I can't just drop it and recreate another one.
Is there a way to run a migration to add another auto increment primary key column to my table?
However, you can only use the ALTER TABLE statement to create a primary key on column(s) that are already defined as NOT NULL. If the column(s) allow NULL values, you will not be able to add the primary key without dropping and recreating the table.
Primary keys - By default, Active Record will use an integer column named id as the table's primary key ( bigint for PostgreSQL and MySQL, integer for SQLite). When using Active Record Migrations to create your tables, this column will be automatically created.
SQL PRIMARY KEY on ALTER TABLE. ADD CONSTRAINT PK_Person PRIMARY KEY (ID,LastName); Note: If you use ALTER TABLE to add a primary key, the primary key column(s) must have been declared to not contain NULL values (when the table was first created).
The command to add a primary key in a migration is:
add_column :my_table, :id, :primary_key
However, the wording of your question suggests that your table already has an auto-increment column. Unless I'm mistaken, there are several DBMS that do not allow more than one auto-increment column on a table.
If you DO already have an auto-increment column and you actually want to use that column as your primary key, just add the following to your model:
set_primary_key "my_existing_column"
Or in more recent versions of Rails:
self.primary_key = "my_existing_column"
In the case that you already have an auto-increment column and you can't use that as the primary key, you may be out of luck.
If for some reason you created a table with a custom id
field, but forgot to set id
as the primary key, you need to run a migration to create the primary key constraint. The following was tested against a PostgreSQL database:
class AddPrimaryKeyConstraintToFoobars < ActiveRecord::Migration def up execute "ALTER TABLE foobars ADD PRIMARY KEY (id);" end def down execute "ALTER TABLE foobars DROP CONSTRAINT foobars_pkey;" end end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With