|
1 | 1 | # frozen_string_literal: true |
2 | 2 |
|
3 | 3 | class ChangeIssuesIdToBigint < ActiveRecord::Migration[7.0] |
4 | | - # Disable transaction to allow running on large tables without locking for too long |
5 | | - # You may want to run this during low-traffic periods |
6 | | - disable_ddl_transaction! |
7 | | - |
8 | 4 | def up |
9 | 5 | # Change the id column from integer (serial) to bigint (bigserial) |
10 | 6 | # This is necessary because the issues table has exceeded the 32-bit integer limit |
11 | 7 | # Max integer: 2,147,483,647 |
12 | 8 | # Max bigint: 9,223,372,036,854,775,807 |
13 | 9 |
|
14 | | - safety_assured do |
15 | | - # Change the primary key column type |
16 | | - execute "ALTER TABLE issues ALTER COLUMN id TYPE bigint" |
17 | | - |
18 | | - # Change the sequence type to bigint as well |
19 | | - execute "ALTER SEQUENCE issues_id_seq AS bigint" |
| 10 | + # Primary keys |
| 11 | + change_column :issues, :id, :bigint |
| 12 | + change_column :issue_assignments, :id, :bigint |
20 | 13 |
|
21 | | - # Also update foreign keys in issue_assignments that reference issues.id |
22 | | - execute "ALTER TABLE issue_assignments ALTER COLUMN issue_id TYPE bigint" |
23 | | - end |
| 14 | + # Foreign keys |
| 15 | + change_column :issue_assignments, :issue_id, :bigint |
24 | 16 | end |
25 | 17 |
|
26 | 18 | def down |
27 | | - safety_assured do |
28 | | - # Note: This could fail if there are values > 2,147,483,647 |
29 | | - execute "ALTER TABLE issue_assignments ALTER COLUMN issue_id TYPE integer" |
30 | | - execute "ALTER SEQUENCE issues_id_seq AS integer" |
31 | | - execute "ALTER TABLE issues ALTER COLUMN id TYPE integer" |
32 | | - end |
| 19 | + # Note: This could fail if there are values > 2,147,483,647 |
| 20 | + change_column :issue_assignments, :issue_id, :integer |
| 21 | + change_column :issue_assignments, :id, :integer |
| 22 | + change_column :issues, :id, :integer |
33 | 23 | end |
34 | 24 | end |
0 commit comments