Commit 3d2a3e57 authored by Andreas Brandl's avatar Andreas Brandl

Docs: FK constraints require an index.

Closes #49789.
parent be1ef711
...@@ -182,6 +182,34 @@ class MyMigration < ActiveRecord::Migration ...@@ -182,6 +182,34 @@ class MyMigration < ActiveRecord::Migration
end end
``` ```
## Adding foreign-key constraints
When adding a foreign-key constraint to either an existing or new
column remember to also add a index on the column.
This is _required_ if the foreign-key constraint specifies
`ON DELETE CASCADE` or `ON DELETE SET NULL` behavior. On a cascading
delete, the [corresponding record needs to be retrieved using an
index](https://www.cybertec-postgresql.com/en/postgresql-indexes-and-foreign-keys/)
(otherwise, we'd need to scan the whole table) for subsequent update or
deletion.
Here's an example where we add a new column with a foreign key
constraint. Note it includes `index: true` to create an index for it.
```ruby
class Migration < ActiveRecord::Migration
def change
add_reference :model, :other_model, index: true, foreign_key: { on_delete: :cascade }
end
end
```
When adding a foreign-key constraint to an existing column, we
have to employ `add_concurrent_foreign_key` and `add_concurrent_index`
instead of `add_reference`.
## Adding Columns With Default Values ## Adding Columns With Default Values
When adding columns with default values you must use the method When adding columns with default values you must use the method
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment