복붙노트

[RUBY-ON-RAILS] 마이그레이션은 열 조합에 고유 제한 조건을 추가하는

RUBY-ON-RAILS

마이그레이션은 열 조합에 고유 제한 조건을 추가하는

내가 필요한 것은 열 조합에 고유 제한 조건을 적용 할 마이그레이션입니다. 즉 사람들 테이블, FIRST_NAME의 조합, LAST_NAME과 생년월일은 고유해야합니다.

해결법

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

    1.add_index 등 : 명, [: FIRSTNAME : LASTNAME : DOB] : 고유 => 사실

    add_index 등 : 명, [: FIRSTNAME : LASTNAME : DOB] : 고유 => 사실

  2. ==============================

    2.howmanyofme.com에 따르면, 미국에서만 "존 스미스라는 이름의 46,427명이 있습니다." 즉 일의 127년에 관하여이다. 이 아니라 인간의 평균 수명 이상으로서, DOB 충돌 수학적 특정 수단이된다.

    howmanyofme.com에 따르면, 미국에서만 "존 스미스라는 이름의 46,427명이 있습니다." 즉 일의 127년에 관하여이다. 이 아니라 인간의 평균 수명 이상으로서, DOB 충돌 수학적 특정 수단이된다.

    내가 말하고 모든 고유 필드의 특정 조합이 미래에 극단적 인 사용자 / 고객 불만으로 이어질 수 있다는 점이다.

    필요한 경우, 국가 식별 번호와 같은, 실제로 독특한 무언가를 생각해 보자.

    (나는 아주 늦게 일을 가진 자에게있어 실현하지만, 미래의 리더를 도울 수 있습니다.)

  3. ==============================

    3.당신은 인덱스없이 제약 조건을 추가 할 수 있습니다. 이것은 당신이 사용중인 데이터베이스에 따라 달라집니다. 다음은 포스트 그레스에 대한 샘플 마이그레이션 코드입니다. (TRACKING_NUMBER, 캐리어)는 제약 조건에 사용할 컬럼의 목록입니다.

    당신은 인덱스없이 제약 조건을 추가 할 수 있습니다. 이것은 당신이 사용중인 데이터베이스에 따라 달라집니다. 다음은 포스트 그레스에 대한 샘플 마이그레이션 코드입니다. (TRACKING_NUMBER, 캐리어)는 제약 조건에 사용할 컬럼의 목록입니다.

    class AddUniqeConstraintToShipments < ActiveRecord::Migration
      def up
        execute <<-SQL
          alter table shipments
            add constraint shipment_tracking_number unique (tracking_number, carrier);
        SQL
      end
    
      def down
        execute <<-SQL
          alter table shipments
            drop constraint if exists shipment_tracking_number;
        SQL
      end
    end
    

    추가 할 수있는 다른 제약 조건이있다. 워드 프로세서 읽기

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

    4.안녕 당신은 예를 들어, 컬럼에 마이그레이션에 고유 인덱스를 추가 할 수 있습니다

    안녕 당신은 예를 들어, 컬럼에 마이그레이션에 고유 인덱스를 추가 할 수 있습니다

    add_index(:accounts, [:branch_id, :party_id], :unique => true)
    

    또는 각 열에 대해 고유 인덱스를 분리

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

    5.a의 전형적인 예에서 사용자와 포스트 사이에 테이블을 조인

    a의 전형적인 예에서 사용자와 포스트 사이에 테이블을 조인

    create_table :users
    create_table :posts
    
    create_table :ownerships do |t|
      t.belongs_to :user, foreign_key: true, null: false
      t.belongs_to :post, foreign_key: true, null: false
    end
    
    add_index :ownerships, [:user_id, :post_id], unique: true
    

    두 개의 유사한 레코드를 만들려고하는 것은 (내 경우에는 포스트 그레스) 데이터베이스 오류가 발생합니다 :

    ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_ownerships_on_user_id_and_post_id"
    DETAIL:  Key (user_id, post_id)=(1, 1) already exists.
    : INSERT INTO "ownerships" ("user_id", "post_id") VALUES ($1, $2) RETURNING "id"
    

    예를 들면 것을 일 :

    Ownership.create!(user_id: user_id, post_id: post_id)
    Ownership.create!(user_id: user_id, post_id: post_id)
    

    완전 실행 가능한 예 : https://gist.github.com/Dorian/9d641ca78dad8eb64736173614d97ced

    dB / schema.rb 생성 : https://gist.github.com/Dorian/a8449287fa62b88463f48da986c1744a

  6. ==============================

    6.완성도를 위해, 그리고 회피 혼란을 여기에 같은 일을하고있는 3 가지 방법이 있습니다 : 레일의 열 조합에 명명 된 고유 제한 조건을 추가 5.2 이상

    완성도를 위해, 그리고 회피 혼란을 여기에 같은 일을하고있는 3 가지 방법이 있습니다 : 레일의 열 조합에 명명 된 고유 제한 조건을 추가 5.2 이상

    하자 우리가 광고주에 속하는 열 reference_code를 가지고 위치 테이블을 가지고 있고 당신은 단지 광고 주당 1 개 참조 코드를 싶은 말은. 그래서 당신은 열 조합에 고유 제한 조건을 추가하고 이름을합니다.

    하다:

    편 g 이주 AddUniquenessConstraintToLocations

    그리고이 하나 라이너 같은 마이그레이션 모습 중 하나 일합니다

    class AddUniquenessConstraintToLocations < ActiveRecord::Migration[5.2]
      def change
        add_index :locations, [:reference_code, :advertiser_id], unique: true, name: 'uniq_reference_code_per_advertiser'
      end
    end
    

    또는이 블록 버전.

    class AddUniquenessConstraintToLocations < ActiveRecord::Migration[5.2]
      def change
        change_table :locations do |t|
         t.index ['reference_code', 'advertiser_id'], name: 'uniq_reference_code_per_advertiser', unique: true
        end
      end
    end
    

    또는이 원시 SQL 버전

    class AddUniquenessConstraintToLocations < ActiveRecord::Migration[5.2]
      def change
          execute <<-SQL
              ALTER TABLE locations
                ADD CONSTRAINT uniq_reference_code_per_advertiser UNIQUE (reference_code, advertiser_id);
            SQL
      end
    end
    

    이들의이 같은 결과를해야합니다, 당신의 schema.rb을 확인

  7. from https://stackoverflow.com/questions/3370271/a-migration-to-add-unique-constraint-to-a-combination-of-columns by cc-by-sa and MIT license