1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-09 18:18:02 +00:00

Add Add A Database Index If It Does Not Already Exist as a Rails TIL

This commit is contained in:
jbranchaud
2023-11-14 11:22:25 -06:00
parent b1994cfe21
commit 778555636e
2 changed files with 38 additions and 1 deletions

View File

@@ -0,0 +1,36 @@
# Add A Database Index If It Does Not Already Exist
Sometimes you aren't sure if an index might already exist in one of the
environments where a migration is going to run. But you still need to add the
index elsewhere. One way of handling that is to add an index with the
`if_not_exists` directive.
```ruby
class AddIndexToEventsCreatedAt < ActiveRecord::Migration[6.1]
def change
add_index :events, :created_at, if_not_exists: true
end
end
```
`ActiveRecord` will translate this directive into the resulting SQL statement
like so:
```sql
create index if not exists index_events_on_created_at on events ... ;
```
This way the index will be created in a database where it doesn't already exist
and otherwise the statement will short-circuit rather than erroring when one
does exist.
A couple notes:
1) From the PostgreSQL manual:
> there is no guarantee that the existing index is anything like the one that
> would have been created.
2) The `if_not_exists` option also works with `create_table`.
[source](https://edgeapi.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html)