Postgres가 수동으로 시퀀스 변경


189

시퀀스를 특정 값으로 설정하려고합니다.

SELECT setval('payments_id_seq'), 21, true

오류가 발생합니다.

ERROR: function setval(unknown) does not exist

사용도 ALTER SEQUENCE작동하지 않는 것 같습니다?

ALTER SEQUENCE payments_id_seq LASTVALUE 22

이것을 어떻게 할 수 있습니까?

참조 : https://www.postgresql.org/docs/current/static/functions-sequence.html


4
setval()적어도 두 가지 주장이있는 것으로 보입니다 .

답변:


262

괄호가 잘못 배치되었습니다.

SELECT setval('payments_id_seq', 21, true);  # next value will be 22

그렇지 않으면 setval하나 또는 두 개의 인수가 필요한 단일 인수로 호출 합니다.


2
마지막 논거 "true"는 무엇을 의미합니까?
inafalcao

15
true다음 값은 제공된 숫자 + 1 (이 경우 22) false임을 의미합니다. 다음 값은 제공된 숫자 또는 21을 의미합니다. 기본적으로 setval true은 선택한 것처럼 동작합니다 . 자세한 내용 : postgresql.org/docs/9.6/static/functions-sequence.html
Tom Mertz

1
select setval구문 의 장점은에 alter sequence중첩 된 쿼리를 사용할 수 있다는 것 select max(id) from payments입니다.
mariotomo

187

이 구문은 모든 버전의 PostgreSQL 에서 유효하지 않습니다 .

ALTER SEQUENCE payments_id_seq LASTVALUE 22

이것은 작동합니다 :

ALTER SEQUENCE payments_id_seq RESTART WITH 22;

다음과 같습니다.

SELECT setval('payments_id_seq', 22, FALSE);

현재 매뉴얼 ALTER SEQUENCE시퀀스 기능에 대한 추가 정보 .

참고 setval()예상하는 하나 (regclass, bigint)또는 (regclass, bigint, boolean). 위의 예에서는 형식화되지 않은 리터럴을 제공하고 있습니다. 그것도 작동합니다. 그러나 타입 변수를 함수에 공급하면 함수 타입 해상도를 만족시키기 위해 명시적인 타입 캐스트 가 필요할 수 있습니다 . 처럼:

SELECT setval(my_text_variable::regclass, my_other_variable::bigint, FALSE);

반복되는 작업의 경우 다음에 관심이있을 수 있습니다.

ALTER SEQUENCE payments_id_seq START WITH 22; -- set default
ALTER SEQUENCE payments_id_seq RESTART;       -- without value

START [WITH]기본 RESTART번호를 저장합니다.이 번호는 RESTART값이없는 후속 통화에 사용됩니다 . 마지막 부분에는 Postgres 8.4 이상이 필요합니다.


4
ALTER SEQUENCE [sequence] RESTART WITH (SELECT MAX(col) from table);작동하지 않지만 작동 SELECT setval('sequence', (SELECT (MAX(col) from table), TRUE);합니다. 구문 오류가 발생합니다. (Postgres 9.4)
NuclearPeon

1
DDL 명령 ( "utility 명령")에 하위 쿼리가 허용되지 않습니다. 참조 : stackoverflow.com/a/36025963/939860
Erwin Brandstetter

1
@MitalPritmani : 타입 캐스트가 필요할 수 있습니다. 위의 추가 지침을 고려하십시오.
Erwin Brandstetter

1
@ NuclearPeon 나는 SELECT setval('sequence', (SELECT MAX(col) from table), TRUE);그렇지 않으면 당신의 파면이 줄을 서 있지 않다고 생각합니다 .
dland

1
@dland : 옆으로 : 더 짧고 더 빠른 등가 : SELECT setval('seq', max(col)) FROM tbl;참조 : stackoverflow.com/a/23390399/939860
Erwin Brandstetter

33

사용하다 select setval('payments_id_seq', 21, true);

setval 3 개의 매개 변수를 포함합니다.

  • 첫 번째 매개 변수는 sequence_name
  • 두 번째 매개 변수는 다음입니다 nextval
  • 세 번째 매개 변수는 선택 사항입니다.

setval의 세 번째 매개 변수에서 true 또는 false를 사용하는 방법은 다음과 같습니다.

SELECT setval('payments_id_seq', 21);           // Next nextval will return 22
SELECT setval('payments_id_seq', 21, true);     // Same as above 
SELECT setval('payments_id_seq', 21, false);    // Next nextval will return 21

시퀀스 이름, 다음 시퀀스 값의 하드 코딩을 피하고 빈 열 테이블을 올바르게 처리하는 더 좋은 방법은 다음과 같습니다.

SELECT setval(pg_get_serial_sequence('table_name', 'id'), coalesce(max(id), 0)+1 , false) FROM table_name;

여기서 table_name테이블의 이름은, id는 IS primary key테이블을


감사합니다! 마지막 표현은 정확히 내가 찾던 것입니다. 나중에 배치로 삽입하기 위해 시퀀스 값을 예약 할 수 있습니다.
Timur


0

를 통해 시퀀스를 변경하려고 시도하지 않습니다 setval. 그러나 사용하여 ALTER시퀀스 이름을 올바르게 작성하는 방법이 발표되었습니다. 그리고 이것은 나에게만 효과적입니다.

  1. 다음을 사용하여 필요한 시퀀스 이름을 확인하십시오. SELECT * FROM information_schema.sequences;

  2. ALTER SEQUENCE public."table_name_Id_seq" restart {number};

    내 경우에는 ALTER SEQUENCE public."Services_Id_seq" restart 8;

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