sourcecode

Postgres가 수동으로 시퀀스

codebag 2023. 5. 8. 22:12
반응형

Postgres가 수동으로 시퀀스

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

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/functions-sequence.html

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

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

그렇지 않으면 당신이 전화하는 겁니다.setval두 개 또는 세 개의 인수가 필요한 반면, 단일 인수로.

이는 다음과 같습니다.SELECT setval('payments_id_seq', 21)

이 구문은 Postgre 버전에서 유효하지 않습니다.SQL:

 
  ALTER SEQUENCE payments_id_seq LASTVALUE 22
 

이렇게 하면 됩니다.

ALTER SEQUENCE payments_id_seq RESTART WITH 22;

다음과 같습니다.

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

및 시퀀스 기능에 대한 자세한 내용은 현재 매뉴얼을 참조하십시오.

참고: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 이상이 필요합니다.

사용하다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그것은primary key식탁의

setval("sequence_name", sequence_value)을 선택합니다.

다음을 통해 시퀀스를 변경하려고 하지 않습니다.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;

또한 wiki.postgresql.org 에는 모든 데이터베이스 테이블의 시퀀스를 한 번에 수정하는 SQL 스크립트를 생성하는 방법을 설명하는 페이지가 있습니다.링크의 텍스트 아래:

파일에 저장합니다. '리셋'이라고 합니다.sql'

SELECT 'SELECT SETVAL(' ||
       quote_literal(quote_ident(PGT.schemaname) || '.' || quote_ident(S.relname)) ||
       ', COALESCE(MAX(' ||quote_ident(C.attname)|| '), 1) ) FROM ' ||
       quote_ident(PGT.schemaname)|| '.'||quote_ident(T.relname)|| ';'
FROM pg_class AS S,
     pg_depend AS D,
     pg_class AS T,
     pg_attribute AS C,
     pg_tables AS PGT
WHERE S.relkind = 'S'
    AND S.oid = D.objid
    AND D.refobjid = T.oid
    AND D.refobjid = C.attrelid
    AND D.refobjsubid = C.attnum
    AND T.relname = PGT.tablename
ORDER BY S.relname;

파일을 실행하고 일반 헤더를 포함하지 않는 방식으로 출력을 저장한 다음 해당 출력을 실행합니다.예:

psql -Atq -f reset.sql -o temp
psql -f temp
rm temp

출력은 다음과 같은 sql 명령 집합입니다.

SELECT SETVAL('public."SocialMentionEvents_Id_seq"', COALESCE(MAX("Id"), 1) ) FROM public."SocialMentionEvents";
SELECT SETVAL('public."Users_Id_seq"', COALESCE(MAX("Id"), 1) ) FROM public."Users";

이것은 나에게 효과가 있었습니다.

SELECT pg_catalog.setval('public.hibernate_sequence', 3, true);

이것은 나에게 효과가 있었습니다.

select pg_catalog.setval('<sequence_variable_name>', <sequence_number_you_want>, true);

세트발 기능만으로는 저에게 효과가 없었습니다.

SELECT pg_catalog.setval('payments_id_seq', 21, true); -- next will be 22

자세한 내용은 문서 참조

언급URL : https://stackoverflow.com/questions/8745051/postgres-manually-alter-sequence

반응형