PostgreSQL 기본 키를 1로 재설정


82

채워진 테이블에서 다시 1부터 시작하도록 PostgreSQL 테이블의 기본 키를 재설정하는 방법이 있습니까?

지금은 1000000 이상에서 숫자를 생성하고 있습니다. 모든 기존 데이터를 그대로 유지하면서 모두 재설정하고 1로 시작하기를 원합니다.

답변:


34

https://stackoverflow.com/a/5272164/5190 에서 더 나은 옵션을 참조하십시오.

자동 증가하는 기본 키 (즉, 데이터 유형이있는 열 serial primary key)는 시퀀스 와 연결됩니다 . setval(<seqname>, <next_value>)함수를 사용하여 시퀀스의 다음 값을 설정할 수 있습니다 . 실제로 자체적으로 함수를 실행하려면 다음 SELECT과 같이 를 사용해야 합니다.SELECT setval(<seqname>, <next_value>)

직렬을 사용할 때 자동 생성 된 시퀀스의 이름은 다음과 같습니다. <table>_<column>_seq


14
당신은, 예를 들어, 호출 앞에 넣어 "SELECT"필요SELECT setval('table_id_seq', 10000)

4
그렇게 SELECT setval('table_id_seq', 1)하면 새 레코드를 삽입 할 때 ID는 1 대신 값 2를 사용 합니다. Paweł Gościcki의 솔루션이 작동합니다. (PostgreSQL 9.3)
푸르스름한

@bluish 아마도 새 기본 키가 할당되기 전에 시퀀스 번호가 증가하는 것 같습니다. 0으로 재설정해야합니다.하지만 어쨌든 다른 솔루션이 더 낫다는 데 동의합니다.
kralyk

189

시퀀스를 재설정하여 번호 1로 다시 시작하는 가장 좋은 방법은 다음을 실행하는 것입니다.

ALTER SEQUENCE <tablename>_<id>_seq RESTART WITH 1

따라서 예를 들어 users테이블의 경우 다음과 같습니다.

ALTER SEQUENCE users_id_seq RESTART WITH 1

21
WITH 1매개 변수는 redundand이며 ommited 할 수 있습니다
제이 섹 크라우 지크

그것은 실제로 시퀀스를 재설정하는 유일한 정답입니다.
Balbinator

1
CREATE TABLE 절에 의해 자동으로 생성 된 인덱스 의 큰 문제 는 이름을 알지 못한다는 것입니다 (접미사는 seq, can by pk등 이 아닙니다 ) ... 그러나 on psql by \d my_table_name. 또는, SQL에 의해 확인SELECT * FROM pg_indexes WHERE tablename like '%my_table_name%'
피터 크라우스에게

3

@bluish는 실제로 자동 증가 기본 키를 사용하여 새 레코드를 삽입하는 것은 다음과 같이 명시 적으로 시퀀스를 사용하는 것과 같습니다.

INSERT INTO MyTable (id, col1, ...) VALUES (MySeq.nextval(), val1, ...)

따라서 첫 번째 ID를 1로 설정하려면 시퀀스를 0으로 설정해야합니다.하지만 범위를 벗어 났으므로 ALTER SEQUECE 문을 사용해야합니다. 예를 들어 테이블 메뉴에 number라는 직렬 필드가있는 경우 :

ALTER SEQUENCE menu_number_seq RESTART

일을 완벽하게 만들 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.