I am trying to add an unique index that gets created from the foreign keys of four associated tables:
add_index :studies, ["user_id", "university_id", "subject_name_id", "subject_type_id"], :unique => true
The database’s limitation for the index name causes the migration to fail. Here’s the error message:
Index name 'index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id' on table 'studies' is too long; the limit is 64 characters
How can I handle this? Can I specify a different index name?
A database index is an ordered data structure(read: another table)that we can create to help our database with some laborious searches.
index: true vs foreign_key:true in migration When we write index: true to any column, it adds a database index to this column. Foreign key enforce referential integrity. In the example above we have profile_id column in educations table which is foreign key of profiles table.
rails db:rollback:primary , where primary is the name of the database in your config/databases. yml file, to rollback the last migration. You can make usage of the STEPS attribute here, as usual. rails db:rollback:primary VERSION=your_migration_timestamp , to rollback only the provided migration version.
Provide the :name
option to add_index
, e.g.:
add_index :studies, ["user_id", "university_id", "subject_name_id", "subject_type_id"], unique: true, name: 'my_index'
If using the :index
option on references
in a create_table
block, it takes the same options hash as add_index
as its value:
t.references :long_name, index: { name: :my_index }
You can also change the index name in column definitions within a create_table
block (such as you get from the migration generator).
create_table :studies do |t| t.references :user, index: {:name => "index_my_shorter_name"} 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