Programing

rename_column이 인덱스를 처리합니까?

lottogame 2020. 12. 25. 08:48
반응형

rename_column이 인덱스를 처리합니까?


다음과 같은 내용이 있습니다.

add_column :users, :single, :boolean
add_index :users, :single

그리고 나중에 우리는

rename_column :users, :single, :married

ActiveRecord 및 / 또는 데이터베이스가 인덱스의 이름 변경도 처리합니까? 아니면 수동으로 인덱스를 삭제하고 다시 추가해야합니까?


PostgreSQL의 rename_column경우 단순하게 구현되며 ALTER TABLE ... RENAME COLUMN ...인덱스를 보존합니다.

MySQL 버전 (둘 다)은 ALTER TABLE ... CHANGE ...색인을 보존하는 작업을 수행합니다.

SQLite 버전은 전체 테이블 (인덱스 포함)을 복사하고 이전 테이블을 삭제 한 다음 복사본을 원래 테이블 이름으로 다시 복사하는 것처럼 보입니다. 복사는 인덱스를 복사하는 동안 열 이름 바꾸기를 처리하는 것처럼 보입니다.

def copy_table(from, to, options = {})
  #...
  copy_table_indexes(from, to, options[:rename] || {})

그리고 내부 copy_table_indexes:

columns = index.columns.map {|c| rename[c] || c }.select do |column|
  to_column_names.include?(column)
end

따라서 표준 드라이버는 a를 수행 할 때 인덱스를 보존 rename_column하고 SQLite 드라이버는이를 수행하기 위해 노력합니다.

API 문서는 특정 동작을 지정하지 않으므로 다른 드라이버가 다른 작업을 수행 할 수 있습니다. 색인에 대해 가장 가까운 문서는 다음과 active_record/migration.rb같습니다.

rename_column(table_name, column_name, new_column_name): 열 이름을 변경하지만 유형과 내용은 유지합니다.

모든 드라이버가 인덱스를 보존 할 것이라고 생각하지만 보장 할 수는 없습니다. 드라이버 작성자는 인덱스를 보존하지 않는 것은 어리석은 일입니다.

이것은 결정적이거나 권위있는 대답은 아니지만 표준 PostgreSQL, MySQL (둘 중 하나) 또는 SQLite 드라이버를 사용하는 경우 인덱스를 보존해야합니다.


인덱스 자체가 열 이름 변경에서 살아남더라도 인덱스 이름 이 변경 된다는 보장은 없습니다 . 관련된 열이 아닌 인덱스 이름에 관심이있는 작업 (예 : 수동으로 삭제)을 수행하지 않는 한 이것은 문제가되지 않습니다.

위의 동작 은 Rails 4에서 변경되었습니다 .

  • Rails 4.0에서 열이나 테이블의 이름이 변경되면 관련 인덱스의 이름도 변경됩니다. 인덱스 이름을 바꾸는 마이그레이션이있는 경우 더 이상 필요하지 않습니다.

따라서 ActiveRecord는 테이블 또는 열의 이름을 바꿀 때 새 테이블 또는 열 이름과 일치하도록 인덱스 이름을 자동으로 바꿉니다. 이에 대해 미리 알려준 sequielo 에게 감사드립니다 .

참조 URL : https://stackoverflow.com/questions/6732896/does-rename-column-take-care-of-indexes

반응형