[sql] PostgreSQL에서 자동 증분 기본 키를 설정하는 방법은 무엇입니까?

PostgreSQL에 22 개의 열이있는 테이블이 있으며 자동 증가 기본 키를 추가하고 싶습니다.

idBIGSERIAL 유형 의 열을 만들려고 했지만 pgadmin이 오류로 응답했습니다.

ERROR: sequence must have same owner as table it is linked to.

누구 든지이 문제를 해결하는 방법을 알고 있습니까? 표를 다시 만들지 않고 PostgreSQL에서 자동 증가 기본 키를 어떻게 추가합니까?



답변

이 명령을 시도하십시오 :

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

테이블 을 작성한 것과 동일한 DB 사용자로 시도하십시오 .


답변

postgresql에서 자동 증분 기본 키 :

1 단계 : 테이블을 만듭니다.

CREATE TABLE epictable
(
    mytable_key    serial primary key,
    moobars        VARCHAR(40) not null,
    foobars        DATE
);

2 단계, 이와 같이 테이블에 값을 삽입하면 mytable_key가 첫 번째 매개 변수 목록에 지정되어 있지 않으므로 기본 시퀀스가 ​​자동 증가합니다.

insert into epictable(moobars,foobars) values('delicious moobars','2012-05-01')
insert into epictable(moobars,foobars) values('worldwide interblag','2012-05-02')

3 단계 : 표에서 *를 선택하십시오.

el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable"

4 단계 : 출력을 해석하십시오.

mytable_key  |        moobars        |  foobars
-------------+-----------------------+------------
           1 | delicious moobars     | 2012-05-01
           2 | world wide interblags | 2012-05-02
(2 rows)

mytable_key 열이 자동으로 증가했는지 확인하십시오.

프로 팁 :

postgresql은 내부적으로 해시 테이블 구조를 사용하여 삽입, 삭제, 업데이트 및 선택 속도를 높이기 때문에 항상 테이블에서 기본 키를 사용해야합니다. 기본 키 열 (고유하고 null이 아닌)을 사용할 수있는 경우 해시 함수에 고유 한 시드를 제공하도록 의존 할 수 있습니다. 기본 키 열을 사용할 수없는 경우 해시 함수는 다른 열 집합을 키로 선택하므로 비효율적입니다.


답변

커스텀 시퀀스를 사용하여 postgresql에서 자동 증분 기본 키를 만듭니다.

1 단계 : 시퀀스 생성

create sequence splog_adfarm_seq
    start 1
    increment 1
    NO MAXVALUE
    CACHE 1;
ALTER TABLE fact_stock_data_detail_seq
OWNER TO pgadmin;

2 단계, 테이블 만들기

CREATE TABLE splog_adfarm
(
    splog_key    INT unique not null,
    splog_value  VARCHAR(100) not null
);

3 단계, 테이블에 삽입

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'),
    'Is your family tree a directed acyclic graph?'
);

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'),
    'Will the smart cookies catch the crumb?  Find out now!'
);

4 단계, 행 관찰

el@defiant ~ $ psql -U pgadmin -d kurz_prod -c "select * from splog_adfarm"

splog_key |                            splog_value
----------+--------------------------------------------------------------------
        1 | Is your family tree a directed acyclic graph?
        2 | Will the smart cookies catch the crumb?  Find out now!
(3 rows)

두 행에는 시퀀스가 ​​정의한대로 1부터 시작하여 1 씩 증가하는 키가 있습니다.

보너스 엘리트 프로 팁 :

프로그래머는 타이핑을 싫어하고 타이핑하는 nextval('splog_adfarm_seq')것은 성가신 일입니다. DEFAULT대신 다음과 같이 해당 매개 변수를 입력 할 수 있습니다 .

insert into splog_adfarm values (
    DEFAULT,
    'Sufficient intelligence to outwit a thimble.'
);

위의 작업을 수행하려면 splog_adfarm 테이블에서 해당 키 열의 기본값을 정의해야합니다. 더 예쁘다.


답변

pgadmin에서이 작업을 수행하려면 훨씬 쉽습니다. postgressql에서 자동 증분을 열에 추가하려면 먼저 자동 증분 시퀀스를 생성하고 필요한 열에 추가해야합니다. 나는 이것을 좋아했다.

1) 먼저 테이블의 기본 키가 있는지 확인해야합니다. 또한 기본 키의 데이터 유형을 bigint 또는 smallint로 유지하십시오. (나는 bigint를 사용했고 다른 곳에서 언급 한 것처럼 serial이라는 데이터 유형을 찾을 수 없었습니다)

2) 그런 다음 sequence-> 새 시퀀스 추가를 마우스 오른쪽 버튼으로 클릭하여 시퀀스를 추가하십시오 . 테이블에 데이터가없는 경우 순서대로 그대로두고 변경하지 마십시오. 그냥 저장하십시오. 기존 데이터가있는 경우 기본 키 열의 마지막 또는 가장 높은 값을 아래 표시된대로 정의 탭의 현재 값에 추가하십시오.
여기에 이미지 설명을 입력하십시오

3) 마지막으로 nextval('your_sequence_name'::regclass)아래 표시된 것처럼 기본 키의 기본값에 줄 을 추가하십시오 .

여기에 이미지 설명을 입력하십시오
여기에서 시퀀스 이름이 올바른지 확인하십시오. 이것이 전부이며 자동 증분이 작동해야합니다.


답변

시퀀스에서 숫자를 사용하려면 다음과 같이 새 시퀀스를 정의하십시오.

CREATE SEQUENCE public.your_sequence
    INCREMENT 1
    START 1
    MINVALUE 1
;

그런 다음 id의 시퀀스를 사용하도록 테이블을 변경하십시오.

ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass);


답변

PostgreSQL에서 기본 키를 성공적으로 자동 증가시키기 위해 다음 스크립트를 시도했습니다.

CREATE SEQUENCE dummy_id_seq
    START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

CREATE table dummyTable (
    id bigint DEFAULT nextval('dummy_id_seq'::regclass) NOT NULL,
    name character varying(50)
);

편집하다:

CREATE table dummyTable (
    id SERIAL NOT NULL,
    name character varying(50)
)

SERIAL 키워드는 각 열에 대한 시퀀스를 자동으로 만듭니다.


답변

어쩌면 나는이 질문에 대답하기에 약간 늦었지만 내 직업 에서이 주제를 연구하고 있습니다. 🙂

‘a_code’열 = c1, c2, c3, c4를 작성하고 싶었습니다.

먼저 이름 ref_id과 유형 으로 열을 열었습니다 serial. 그런 다음이 명령으로 내 문제를 해결했습니다.

update myschema.mytable set a_code=cast('c'||"ref_id" as text)