복붙노트

[RUBY-ON-RAILS] (레코드의 ID되지 않음) 필드에 PostgreSQL의 시퀀스를 작성

RUBY-ON-RAILS

(레코드의 ID되지 않음) 필드에 PostgreSQL의 시퀀스를 작성

나는 루비 온 레일즈 응용 프로그램에서 일하고 있습니다. 우리는 PostgreSQL 데이터베이스를 사용하고 있습니다.

다음과 같은 열이 점수라는 이름의 테이블이 있습니다 :

Column        | Type
--------------+-----------------------
id            | integer
value         | double precision
ran_at        | timestamp
active        | boolean
build_id      | bigint
metric_id     | integer
platform_id   | integer
mode_id       | integer
machine_id    | integer
higher_better | boolean
job_id        | integer
variation_id  | integer
step          | character varying(255)

나는 작업 ID에 시퀀스를 추가해야합니다 (참고 : 모델 작업 없음).

어떻게하면이 순서를 만들려면 어떻게해야합니까?

해결법

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

    1.사용 순서를 만들 :

    사용 순서를 만들 :

    CREATE SEQUENCE scores_job_id_seq;  -- = default name for plain a serial
    

    그런 다음 scores.job_id에 열 기본을 추가 :

    ALTER TABLE scores ALTER COLUMN job_id SET DEFAULT nextval('scores_job_id_seq');
    

    당신이 (열이 삭제 될 때 삭제되도록) 컬럼에 순서를 결합 할 경우, 또한 실행

    ALTER SEQUENCE scores_job_id_seq OWNED BY scores.job_id;
    

    이 모든 것은이 열에 대한 의사 데이터 유형을 사용 직렬로 대체 될 수있는 것은 우선 작업 ID :

    테이블은 이미 행이있는 경우, 테이블의 일련 누락 된 값에 다음으로 높은 가치와 채우기에 순서를 설정할 수 있습니다 :

    SELECT setval('scores_job_id_seq', COALESCE(max(job_id), 1)) FROM scores;
    

    선택적 :

    UPDATE scores
    SET    job_id = nextval('scores_job_id_seq')
    WHERE  job_id IS NULL;
    

    남아있는 유일한 차이는, 직렬 컬럼은 NOT의 NULL로 설정됩니다. 당신은 너무, 그렇게하지 않을 수 있습니다 :

    ALTER TABLE scores ALTER COLUMN job_id SET NOT NULL;
    

    그러나 당신은 단지 기존 정수의 유형을 변경할 수 없습니다 :

    ALTER TABLE scores ALTER job_id TYPE serial;

    직렬 실제 데이터 타입이다. 이 테이블 만들기위한 단지 표기 편리한 기능입니다. 포스트 그레스 10 년 이상 IDENTITY 열을 고려 :

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

    2.그래서 루비 온 레일즈에 액티브 마이그레이션을 사용하여이 작업을 수행하는 방법을 알아 냈어. 나는 기본적으로이 페이지에서 어윈의 명령과 도움을 사용하여 마이그레이션 파일에 넣어. 이러한 단계는 다음과 같습니다

    그래서 루비 온 레일즈에 액티브 마이그레이션을 사용하여이 작업을 수행하는 방법을 알아 냈어. 나는 기본적으로이 페이지에서 어윈의 명령과 도움을 사용하여 마이그레이션 파일에 넣어. 이러한 단계는 다음과 같습니다

    1. 단말기, 유형 :

    rails g migration CreateJobIdSequence
    rails g migration AddJobIdSequenceToScores
    

    2. 편집 다음과 같이 마이그레이션 파일 :

    20140709181616_create_job_id_sequence.rb :

    class CreateJobIdSequence < ActiveRecord::Migration
      def up
        execute <<-SQL
          CREATE SEQUENCE job_id_seq;
        SQL
      end
    
      def down
        execute <<-SQL
          DROP SEQUENCE job_id_seq;
        SQL
      end
    end
    

    20140709182313_add_job_id_sequence_to_scores.rb :

    class AddJobIdSequenceToScores < ActiveRecord::Migration
      def up
        execute <<-SQL
          ALTER SEQUENCE job_id_seq OWNED BY scores.job_id;
          ALTER TABLE scores ALTER COLUMN job_id SET DEFAULT nextval('job_id_seq');
        SQL
      end
    
      def down
        execute <<-SQL
          ALTER SEQUENCE job_id_seq OWNED BY NONE;
          ALTER TABLE scores ALTER COLUMN job_id SET NOT NULL;
        SQL
      end
    end
    

    삼. 데이터베이스를 마이그레이션합니다. 터미널 타입 :

    rake db:migrate
    
  3. from https://stackoverflow.com/questions/24657693/creating-a-postgresql-sequence-to-a-field-which-is-not-the-id-of-the-record by cc-by-sa and MIT license