postgres에서 자동 증분 카운터 재설정


232

테이블의 자동 증분 필드를 특정 값으로 설정하고 싶습니다.

ALTER TABLE product AUTO_INCREMENT = 1453

ALTER SEQUENCE product  RESTART WITH 1453;
ERROR:  relation "your_sequence_name" does not exist

나는 postgres를 처음 사용합니다 :(

나는 테이블이 productIdname필드


5
새로운 경우 pgAdmin을 사용하지 않고 명령을 검사하는 이유는 무엇입니까?
Unreason

1
일반적으로 테이블의 이름은 "products"가 아닌 "products"와 같으며이 경우 시퀀스의 이름은 "products_id_seq"와 같을 것입니다 올바른 시퀀스를 찾고 있는지 확인하십시오
Alexander Gorg

답변:


309

테이블을 만든 경우 productid열, 다음 순서는 단순히 호출되지 product않고, product_id_seq(입니다 ${table}_${column}_seq).

이것이 ALTER SEQUENCE필요한 명령입니다.

ALTER SEQUENCE product_id_seq RESTART WITH 1453

\dspsql 의 명령을 사용하여 데이터베이스의 시퀀스를 볼 수 있습니다 . 당신이 경우에 \d product당신의 열의 기본 제약 봐의 nextval(...)호출은 너무 시퀀스 이름을 지정합니다.


66
이 메시지에서 올바른 구문이 무엇인지 명확하지 않습니다. ALTER SEQUENCE product_id_seq RESTART WITH 1453;
Liron Yahdav

7
위의 내용을 잘못 파싱했기 때문에 여기에 똑같은 것을 복원하는 방법이 있습니다. 구문은입니다 ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #. 여기서 "seq"는 리터럴 텍스트이며 #에 숫자를 입력합니다. 밑줄을 무시하지 마십시오. :-)
kmort

2
공개 스키마를 사용하지 않는 경우 my_schema를 접두사로 사용해야합니다. ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
Daniel L. VanDenBosch

ALTER SEQUENCE product_id_seq가 RESTART WITH (제품에서 SELECT MAX (id)) 인 이유를 아는 사람이 있습니까? 작동하지 않습니까? 내가 찾은 유일한 방법은 두 개의 별도 쿼리를 사용하는 것입니다.
Chris Huang-Leaver

8
다시 시작하는 값은 사용하려는 다음 값입니다. 따라서 이미 id를 가진 레코드가 있다면 1453해야합니다 RESTART WITH 1454.
hughes

144

제품 테이블의 시퀀스가 ​​product_id_seq라고 가정하고 찾고있는 명령은 다음과 같습니다.

ALTER SEQUENCE product_id_seq 1453으로 다시 시작;


130

다음 명령이 자동으로 이를 수행합니다. 테이블의 모든 데이터도 삭제됩니다. 그러니 조심해.

TRUNCATE TABLE someTable RESTART IDENTITY;

21
주의하십시오-모든 데이터도 삭제됩니다
kibibu

28
@Loolooii, 그냥 신고; 예를 들어 ORM을 통해 자동 증가 필드가있는 테이블에 행을 수동으로 추가했기 때문에 SQL에 익숙하지 않은 누군가가 여기에서 검색하는 경우이 솔루션은 아마도 예상과 다릅니다.
kibibu

1
TABLE키워드는 중복됩니다. TRUNCATE someTable RESTART IDENTITY;충분하다.
user1

CASCADE로 어떻게 할 수 있습니까?
ihossain

2
@ihossain 시도 TRUNCATE someTable RESTART IDENTITY CASCADE;했습니까?
Vedran

55

시퀀스 카운터를 설정하려면

setval('product_id_seq', 1453);

시퀀스 이름을 모르는 경우 pg_get_serial_sequence함수를 사용하십시오 .

select pg_get_serial_sequence('product', 'id');
 pg_get_serial_sequence 
------------------------
 public.product_id_seq

매개 변수는 테이블 이름과 열 이름입니다.

또는 프롬프트 \d product에서 a 를 발행하십시오 psql.

=> \d product
                         Table "public.product"
 Column |  Type   |                      Modifiers                       
--------+---------+------------------------------------------------------
 id     | integer | not null default nextval('product_id_seq'::regclass)
 name   | text    | 

14

-시퀀스의 시작 값을 변경

ALTER SEQUENCE project_id_seq RESTART 3000;

동일하지만 동적 :

SELECT SETVAL('project_id_seq', (SELECT MAX(id) + 1 FROM project));

SELECT 사용이 혼란 스럽지만 작동한다는 데 동의합니다.

출처 : https://kylewbanks.com/blog/Adding-or-Modifying-a-PostgreSQL-Sequence-Auto-Increment


내가 실수하지 않으면 PG는 last_value 및 is_called로 시퀀스를 나타내며 (1, false)에서 시작한 다음 (1, true), (2, true) ... MAX (id) + 1은 MAX 여야합니다 (id) 대신 id를 건너 뛰지 마십시오.
10

이 작업을 수행하려면 postgres 인스턴스를 다시 시작해야했습니다. brew services restart postgresql
BigRon

SELECT SETVAL ( 'project_id_seq', (SELECT MAX (id) + 1 FROM 프로젝트)); 완벽하게 작동하지만 증가 값을 0으로 재설정하는 방법이 있습니까? 따라서 새 항목은 0 인덱스로 시작합니까?
카리스 자야 산카

13

손님의 편의를 위해 의견에서 전환

이 메시지에서 올바른 구문이 무엇인지 명확하지 않습니다. 그것은:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

6

GUI에서 자동 증분 을 재설정 하려면 다음 단계를 수행하십시오.

  1. 데이터베이스로 이동
  2. 공개를 클릭하십시오
  3. 테이블 목록 페이지에서 '테이블', '보기', '시퀀스'와 같은 TABS 를 볼 수 있습니다 .
  4. 시퀀스를 클릭하십시오
  5. '시퀀스'를 클릭하면 모든 시퀀스 목록을 볼 수 있습니다. 재설정 하려는 것을 클릭하십시오.
  6. 그 후 'Alter', 'Set Value', 'Restart', 'Reset'등과 같은 다중 선택을 볼 수 있습니다.
  7. 그런 다음 재설정 을 클릭 한 다음 새 행을 하나 추가하십시오.

6

다음 값을 재설정하려는 IDENTITY 열이있는 테이블이있는 경우 다음 명령을 사용할 수 있습니다.

ALTER TABLE <table name> 
    ALTER COLUMN <column name> 
        RESTART WITH <new value to restart with>;

1
sequence테이블이 없거나 잘리지 않는 경우 유용성을 위해 1 + . 나는 그것이 최선의 방법이라고 생각합니다
ABS

5

자동 증분을 재설정하려면 다음 쿼리를 사용하여 시퀀스 이름을 가져와야합니다.

통사론:

SELECT pg_get_serial_sequence(‘tablename’,  columnname‘);

예:

SELECT pg_get_serial_sequence('demo', 'autoid');

쿼리는 autoid의 시퀀스 이름을 "Demo_autoid_seq" 로 반환합니다. 후 다음 쿼리를 사용하여 autoid를 재설정합니다

통사론:

ALTER SEQUENCE sequenceName RESTART WITH value;

예:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;

3

시퀀스 ID를 사용하려면

SELECT pg_get_serial_sequence('tableName', 'ColumnName');

이것은 당신에게 tableName_ColumnName_seq 와 같은 sequesce ID를 줄 것입니다

마지막 시드 번호를 사용하려면

select currval(pg_get_serial_sequence('tableName', 'ColumnName'));

또는 시퀀스 ID를 이미 알고 있다면 직접 사용하십시오.

select currval(tableName_ColumnName_seq);

마지막 시드 번호를 알려줍니다

시드 번호를 재설정하려면

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45

1

이 쿼리를 사용 하여 스키마 및 테이블 이 포함 된 시퀀스 키 를 확인하십시오 .

SELECT pg_get_serial_sequence('"SchemaName"."TableName"', 'KeyColumnName'); // output: "SequenceKey"

이 쿼리 증가 증분 값을 하나씩 사용하십시오.

SELECT nextval('"SchemaName"."SequenceKey"'::regclass); // output 110

테이블에 삽입 할 때 다음 증가 된 값이 키 (111)로 사용됩니다.

이 쿼리를 사용하여 특정 값을 증분 값으로 설정하십시오.

SELECT setval('"SchemaName"."SequenceKey"', 120);

테이블에 삽입 할 때 다음 증가 된 값이 키 (121)로 사용됩니다.


0

테이블 이름이 '_'인 경우 시퀀스 이름에서 제거됩니다.

예를 들어, 테이블 이름 : user_tokens 열 : id 시퀀스 이름 : usertokens_id_seq

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