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
시퀀스 이름을 올바르게 쓰는 방법을 알려주었습니다.그리고 이것은 오직 나에게만 효과가 있습니다.
다음을 사용하여 필요한 시퀀스 이름 확인
SELECT * FROM information_schema.sequences;
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
'sourcecode' 카테고리의 다른 글
배시 완료와 관련하여 ${array[*]} 대 ${array[@]}에 대한 혼동 (0) | 2023.05.08 |
---|---|
변경 시 라디오 사용 방법 (0) | 2023.05.08 |
TypeError: 정수 스칼라 배열만 1D numpy 인덱스 배열로 스칼라 인덱스로 변환할 수 있습니다. (0) | 2023.05.08 |
jQuery를 사용하여 CSS 디스플레이 없음 또는 차단 속성을 변경하려면 어떻게 해야 합니까? (0) | 2023.05.08 |
MongoDB와 CouchDB는 완벽한 대체물입니까? (0) | 2023.05.08 |