[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.사용 순서를 만들 :
사용 순서를 만들 :
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.그래서 루비 온 레일즈에 액티브 마이그레이션을 사용하여이 작업을 수행하는 방법을 알아 냈어. 나는 기본적으로이 페이지에서 어윈의 명령과 도움을 사용하여 마이그레이션 파일에 넣어. 이러한 단계는 다음과 같습니다
그래서 루비 온 레일즈에 액티브 마이그레이션을 사용하여이 작업을 수행하는 방법을 알아 냈어. 나는 기본적으로이 페이지에서 어윈의 명령과 도움을 사용하여 마이그레이션 파일에 넣어. 이러한 단계는 다음과 같습니다
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
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
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] ActionController :: ParameterMissing (PARAM가 없거나 값이 비어 : 필름) : (0) | 2020.02.26 |
---|---|
[RUBY-ON-RAILS] 왜 "방지 추가 대화 상자 만들기에서이 페이지의"경고 상자에 나타납니다? (0) | 2020.02.26 |
[RUBY-ON-RAILS] Windows 7에서 MySQL2 보석을 설치할 수 없음 (0) | 2020.02.26 |
[RUBY-ON-RAILS] 호환되지 않는 라이브러리 버전 : nokogiri.bundle 버전 11.0.0 이상,하지만 libxml2.2.dylib 필요 (0) | 2020.02.26 |
[RUBY-ON-RAILS] 양조를 사용할 때 "잘못된 인터프리터"오류 얻기 (0) | 2020.02.26 |