Đặt lại bộ đếm tăng tự động trong postgres


232

Tôi muốn buộc trường tăng tự động của bảng thành một giá trị nào đó, tôi đã thử với điều này:

ALTER TABLE product AUTO_INCREMENT = 1453

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

Tôi chưa quen với postgres :(

Tôi có một bảng productvới Idnamelĩnh vực


5
Nếu mới tại sao không sử dụng pgAdmin và kiểm tra các lệnh nó sẽ tạo ra?
Không hợp lý

1
Thông thường các bảng được đặt tên như 'sản phẩm "và không giống như" sản phẩm ". Trong trường hợp này, chuỗi của bạn sẽ được đặt tên là" sản phẩm_id_seq ". Hãy chắc chắn rằng bạn đang tìm kiếm một chuỗi chính xác.
Alexander Gorg

Câu trả lời:


309

Nếu bạn đã tạo bảng productbằng một idcột, thì chuỗi không chỉ đơn giản được gọi product, mà là product_id_seq(đó là, ${table}_${column}_seq).

Đây là ALTER SEQUENCElệnh bạn cần:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

Bạn có thể thấy các chuỗi trong cơ sở dữ liệu của bạn bằng cách sử dụng \dslệnh trong psql. Nếu bạn làm \d productvà nhìn vào ràng buộc mặc định cho cột của mình, nextval(...)cuộc gọi cũng sẽ chỉ định tên chuỗi.


66
Không rõ từ thông báo này cú pháp chính xác là gì. Đó là: ALTER SEQUENCE sản phẩm_id_seq RESTART VỚI 1453;
Liron Yahdav

7
Chỉ vì tôi phân tích cú pháp kém ở trên, đây là cách tôi phục hồi chính xác điều tương tự. Cú pháp là ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #, trong đó "seq" là văn bản bằng chữ và bạn đặt một số cho #. Đừng bỏ bê phần dưới. :-)
kmort

2
Xin lưu ý rằng nếu không sử dụng lược đồ công cộng thì cần phải có tiền tố với my_schema. ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
Daniel L. VanDenBosch

Có ai biết tại sao ALTER SEQUENCE sản phẩm_id_seq RESTART VỚI (CHỌN MAX (id) từ sản phẩm); Không hoạt động? Cách duy nhất tôi tìm thấy là sử dụng hai truy vấn riêng biệt.
Chris Huang-Leaver

8
Lưu ý rằng giá trị bạn khởi động lại là giá trị tiếp theo bạn muốn sử dụng. Vì vậy, nếu bạn đã có một bản ghi với id 1453, bạn nên RESTART WITH 1454.
hughes

144

Đây là lệnh mà bạn đang tìm kiếm, giả sử chuỗi của bạn cho bảng sản phẩm là sản phẩm_id_seq:

THAY ĐỔI sản phẩm_id_seq RESTART VỚI 1453;


130

Lệnh sau thực hiện điều này tự động cho bạn: Điều này cũng sẽ xóa tất cả dữ liệu trong bảng. Vì vậy, hãy cẩn thận.

TRUNCATE TABLE someTable RESTART IDENTITY;

21
Coi chừng - điều này cũng sẽ xóa tất cả dữ liệu của bạn
kibibu

28
@Loolooii, Chỉ cần gắn cờ nó; nếu ai đó không quen thuộc với SQL đang tìm kiếm ở đây vì họ đã thêm thủ công một hàng vào bảng có trường tự động (chẳng hạn thông qua ORM), thì giải pháp này có thể không phải là điều họ mong đợi.
kibibu

1
Các TABLEtừ khóa là dư thừa. TRUNCATE someTable RESTART IDENTITY;Là đủ.
dùng1

Bất cứ ý tưởng làm thế nào tôi sẽ làm điều này với CASCADE?
ihossain

2
@ihossain bạn đã thử TRUNCATE someTable RESTART IDENTITY CASCADE;chưa?
Vedran

55

Để đặt bộ đếm trình tự:

setval('product_id_seq', 1453);

Nếu bạn không biết tên trình tự, hãy sử dụng pg_get_serial_sequencehàm:

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

Các tham số là tên bảng và tên cột.

Hoặc chỉ cần ra \d producttại psqldấu nhắc:

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

13

Chuyển đổi từ nhận xét vì sự thuận tiện của khách truy cập

Không rõ từ thông báo này cú pháp chính xác là gì. Nó là:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

13

- Thay đổi giá trị bắt đầu của chuỗi

ALTER SEQUENCE project_id_seq RESTART 3000;

Tương tự nhưng năng động:

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

Tôi đồng ý việc sử dụng CHỌN là đáng lo ngại nhưng nó hoạt động.

Nguồn: https://kylewbanks.com/blog/Adding-or-Modifying-a-PostgreQuery-Sequence-Auto-Increment


Nếu tôi không nhầm, PG biểu thị các chuỗi của chúng bằng last_value và is_called, bắt đầu từ (1, sai), sau đó (1, đúng), (2, đúng) ... vì vậy MAX (id) + 1 phải là MAX (id) thay vì không bỏ qua một id.
Mười

Tôi cũng đã phải khởi động lại ví dụ postgres của mình để nó hoạt động. brew services restart postgresql
BigRon

CHỌN SETVAL ('project_id_seq', (CHỌN MAX (id) + 1 TỪ dự án)); Hoạt động hoàn hảo Nhưng có cách nào để đặt lại giá trị tăng lên 0. Vì vậy, các mục mới bắt đầu bằng chỉ số 0?
Charith Jayasanka

6

nếu bạn muốn Đặt lại tăng tự động từ GUI, hãy làm theo các bước này.

  1. Chuyển đến cơ sở dữ liệu của bạn
  2. Bấm vào Công khai
  3. trong trang Bảng liệt kê, bạn có thể thấy TABS như 'Bảng', 'Lượt xem', 'Chuỗi' như thế.
  4. Nhấp vào Trình tự
  5. khi bạn nhấp vào 'Trình tự', bạn có thể thấy tất cả Danh sách trình tự, nhấp vào bất kỳ mục nào bạn muốn đặt lại
  6. Sau đó, bạn có thể thấy nhiều lựa chọn như 'Thay đổi', 'Đặt giá trị', 'Khởi động lại', 'Đặt lại', v.v.
  7. sau đó nhấp vào Đặt lại , sau đó thêm một Hàng mới.

6

Nếu bạn có một bảng có cột IDENTITY mà bạn muốn đặt lại giá trị tiếp theo, bạn có thể sử dụng lệnh sau:

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

1
Một + cho khả năng sử dụng trong trường hợp không có sequencehoặc bạn KHÔNG thể cắt ngắn bảng. Tôi nghĩ đó là câu trả lời hay nhất
ABS

5

Để đặt lại mức tăng tự động, bạn phải lấy tên trình tự của mình bằng cách sử dụng truy vấn sau.

Cú pháp:

SELECT pg_get_serial_sequence(‘tablename’,  columnname‘);

Thí dụ:

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

Truy vấn sẽ trả về tên chuỗi của autoid là "Demo_autoid_seq" Sau đó sử dụng truy vấn sau để đặt lại autoid

Cú pháp:

ALTER SEQUENCE sequenceName RESTART WITH value;

Thí dụ:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;

3

Để có được chuỗi id sử dụng

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

Điều này sẽ mang đến cho bạn id sequesce như tableName_ColumnName_seq

Để có được số hạt giống cuối cùng sử dụng

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

hoặc nếu bạn biết id chuỗi đã sử dụng nó trực tiếp.

select currval(tableName_ColumnName_seq);

Nó sẽ cho bạn số hạt giống cuối cùng

Để thiết lập lại số hạt giống, sử dụng

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45

1

Sử dụng truy vấn này để kiểm tra Khóa Trình tự với Lược đồ và Bảng là gì,

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

Sử dụng truy vấn này tăng giá trị tăng từng cái một,

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

Khi chèn vào bảng, giá trị tăng tiếp theo sẽ được sử dụng làm khóa (111).

Sử dụng truy vấn này để đặt giá trị cụ thể làm giá trị tăng

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

Khi chèn vào bảng, giá trị tăng tiếp theo sẽ được sử dụng làm khóa (121).


0

Lưu ý rằng nếu bạn có tên bảng với '_', nó sẽ bị xóa trong tên chuỗi.

Ví dụ: tên bảng: cột user_tokens: id Tên trình tự: usertokens_id_seq

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.