Rename the primary key index when renaming a table in pg
Also checked to make sure this does not affect foreign key constraints. (It doesn't). Fixes #12856 Closes #14088
This commit is contained in:
parent
b33ed44ad3
commit
dcc143cd70
@ -1,3 +1,9 @@
|
||||
* Renaming a table in pg also renames the primary key index.
|
||||
|
||||
Fixes #12856
|
||||
|
||||
*Sean Griffin*
|
||||
|
||||
* Make it possible to access fixtures excluded by a `default_scope`.
|
||||
|
||||
*Yves Senn*
|
||||
|
@ -411,7 +411,10 @@ def rename_table(table_name, new_name)
|
||||
pk, seq = pk_and_sequence_for(new_name)
|
||||
if seq && seq.identifier == "#{table_name}_#{pk}_seq"
|
||||
new_seq = "#{new_name}_#{pk}_seq"
|
||||
idx = "#{table_name}_pkey"
|
||||
new_idx = "#{new_name}_pkey"
|
||||
execute "ALTER TABLE #{quote_table_name(seq)} RENAME TO #{quote_table_name(new_seq)}"
|
||||
execute "ALTER INDEX #{quote_table_name(idx)} RENAME TO #{quote_table_name(new_idx)}"
|
||||
end
|
||||
|
||||
rename_table_indexes(table_name, new_name)
|
||||
|
@ -0,0 +1,34 @@
|
||||
require "cases/helper"
|
||||
|
||||
class PostgresqlRenameTableTest < ActiveRecord::TestCase
|
||||
def setup
|
||||
@connection = ActiveRecord::Base.connection
|
||||
@connection.create_table :before_rename, force: true
|
||||
end
|
||||
|
||||
def teardown
|
||||
@connection.execute 'DROP TABLE IF EXISTS "before_rename"'
|
||||
@connection.execute 'DROP TABLE IF EXISTS "after_rename"'
|
||||
end
|
||||
|
||||
test "renaming a table also renames the primary key index" do
|
||||
# sanity check
|
||||
assert_equal 1, num_indices_named("before_rename_pkey")
|
||||
assert_equal 0, num_indices_named("after_rename_pkey")
|
||||
|
||||
@connection.rename_table :before_rename, :after_rename
|
||||
|
||||
assert_equal 0, num_indices_named("before_rename_pkey")
|
||||
assert_equal 1, num_indices_named("after_rename_pkey")
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def num_indices_named(name)
|
||||
@connection.execute(<<-SQL).values.length
|
||||
SELECT 1 FROM "pg_index"
|
||||
JOIN "pg_class" ON "pg_index"."indexrelid" = "pg_class"."oid"
|
||||
WHERE "pg_class"."relname" = '#{name}'
|
||||
SQL
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue
Block a user