복붙노트

[RUBY-ON-RAILS] 어떻게 루비 레일에 액티브 마이그레이션에 너무 오래 인덱스 이름을 처리 할 수 ​​있습니까?

RUBY-ON-RAILS

어떻게 루비 레일에 액티브 마이그레이션에 너무 오래 인덱스 이름을 처리 할 수 ​​있습니까?

나는 네 개의 관련 테이블의 외래 키에서 작성되는 고유 인덱스를 추가하는 것을 시도하고있다 :

add_index :studies,
  ["user_id", "university_id", "subject_name_id", "subject_type_id"],
  :unique => true

인덱스 이름에 대한 데이터베이스의 제한은 마이그레이션이 실패합니다. 다음 오류 메시지는 다음과 같습니다

나는이 문제를 어떻게 처리 할 수 ​​있습니까? 나는 다른 인덱스 이름을 지정할 수 있습니까?

해결법

  1. ==============================

    1.예컨대 add_index 등에 이름 옵션 : 다음을 제공합니다

    예컨대 add_index 등에 이름 옵션 : 다음을 제공합니다

    add_index :studies,
      ["user_id", "university_id", "subject_name_id", "subject_type_id"], 
      :unique => true,
      :name => 'my_index'
    

    사용하는 경우 : a CREATE_TABLE 블록 참조에 인덱스 옵션을, 그것의 값으로 add_index 등과 같은 옵션 해시를 취합니다

    t.references :long_name, index: { name: :my_index }
    
  2. ==============================

    2.당신은 또한 (마이그레이션 발생기로부터 얻을 수 등)를 CREATE_TABLE 블록 내에서 열 정의에 인덱스 이름을 변경할 수 있습니다.

    당신은 또한 (마이그레이션 발생기로부터 얻을 수 등)를 CREATE_TABLE 블록 내에서 열 정의에 인덱스 이름을 변경할 수 있습니다.

    create_table :studies do |t|
      t.references :user, index: {:name => "index_my_shorter_name"}
    end
    
  3. ==============================

    3.PostgreSQL의에서 기본 한도는 63 자입니다. 인덱스 이름은 고유해야하기 때문에 그것은 약간의 규칙을 가지고하는 것이 좋다. 나는 (내가 좀 더 복잡한 구조를 설명하기 위해 예를 쥐게)를 사용합니다 :

    PostgreSQL의에서 기본 한도는 63 자입니다. 인덱스 이름은 고유해야하기 때문에 그것은 약간의 규칙을 가지고하는 것이 좋다. 나는 (내가 좀 더 복잡한 구조를 설명하기 위해 예를 쥐게)를 사용합니다 :

    def change
      add_index :studies, [:professor_id, :user_id], name: :idx_study_professor_user
    end
    

    일반적인 지수는이었을 것입니다 :

    :index_studies_on_professor_id_and_user_id
    

    논리는 다음과 같습니다

    어떤 일반적으로 작업을 수행합니다.

  4. ==============================

    4.당신은 또한 할 수있다

    당신은 또한 할 수있다

    t.index([:branch_id, :party_id], unique: true, name: 'by_branch_party')
    

    루비 온 레일스 API에있다.

  5. ==============================

    5.이전의 대답과 유사 : 그냥 일반 add_index 등 라인 '이름'키를 사용 :

    이전의 대답과 유사 : 그냥 일반 add_index 등 라인 '이름'키를 사용 :

    def change
      add_index :studies, :user_id, name: 'my_index'
    end
    
  6. ==============================

    6.나는하지만 타임 스탬프 기능이 문제를 가지고 있었다. 그것은 63 자 제한을 초과 updated_at에 인덱스를로 자동으로 생성되었다 :

    나는하지만 타임 스탬프 기능이 문제를 가지고 있었다. 그것은 63 자 제한을 초과 updated_at에 인덱스를로 자동으로 생성되었다 :

    def change
      create_table :toooooooooo_loooooooooooooooooooooooooooooong do |t|
        t.timestamps
      end
    end
    

    나는 인덱스 이름을 지정하는 타임 스탬프를 사용하려고 :

    def change
      create_table :toooooooooo_loooooooooooooooooooooooooooooong do |t|
        t.timestamps index: { name: 'too_loooooooooooooooooooooooooooooong_updated_at' }
      end
    end
    

    그러나이 시도는 모두 updated_at과 created_at 필드에 인덱스 이름을 적용합니다 :

    마지막으로 나는 타임 스탬프에 포기하고 그냥가 먼 길을 타임 스탬프를 생성 :

    def change
      create_table :toooooooooo_loooooooooooooooooooooooooooooong do |t|
        t.datetime :updated_at, index: { name: 'too_long_on_updated_at' }
        t.datetime :created_at, index: { name: 'too_long_on_created_at' }
      end
    end
    

    작동하지만 나는 그것이 타임 스탬프 방법으로 가능하다면 듣고 싶어요이!

  7. from https://stackoverflow.com/questions/5443740/how-do-i-handle-too-long-index-names-in-a-ruby-on-rails-activerecord-migration by cc-by-sa and MIT license