diff options
author | Andreas Brandl <abrandl@gitlab.com> | 2018-08-01 12:05:37 +0200 |
---|---|---|
committer | Andreas Brandl <abrandl@gitlab.com> | 2018-08-08 23:30:48 +0200 |
commit | 3d2a3e5782aaff37c4b27dc9d3858031ab0c9059 (patch) | |
tree | 4fab554646b378f8971aca5a6d6ae3244309e170 /doc | |
parent | be1ef711edb13114cf6478821293bb2f0821e75c (diff) | |
download | gitlab-ce-3d2a3e5782aaff37c4b27dc9d3858031ab0c9059.tar.gz |
Docs: FK constraints require an index.
Closes #49789.
Diffstat (limited to 'doc')
-rw-r--r-- | doc/development/migration_style_guide.md | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/doc/development/migration_style_guide.md b/doc/development/migration_style_guide.md index a211effdfa7..6f31e5b82e5 100644 --- a/doc/development/migration_style_guide.md +++ b/doc/development/migration_style_guide.md @@ -182,6 +182,34 @@ class MyMigration < ActiveRecord::Migration 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 When adding columns with default values you must use the method |