รีเซ็ตตัวนับการเพิ่มอัตโนมัติใน postgres


232

ฉันต้องการบังคับให้ฟิลด์การเพิ่มอัตโนมัติของตารางเป็นค่าบางอย่างฉันได้ลองทำสิ่งนี้:

ALTER TABLE product AUTO_INCREMENT = 1453

และ

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

ฉันใหม่เพื่อ postgres :(

ผมมีตารางproductที่มีIdและnameข้อมูล


5
หากใหม่ทำไมไม่ใช้ pgAdmin และตรวจสอบคำสั่งมันจะสร้าง?
Unreason

1
โดยปกติตารางจะมีชื่อเหมือน 'ผลิตภัณฑ์' และไม่เหมือนกับ "ผลิตภัณฑ์" ในกรณีนี้ลำดับของคุณจะถูกตั้งชื่อเป็น "products_id_seq" ให้แน่ใจว่าคุณกำลังมองหาลำดับที่ถูกต้อง
Alexander Gorg

คำตอบ:


309

หากคุณสร้างตารางproductด้วยidคอลัมน์ลำดับนั้นจะไม่ถูกเรียกง่ายๆproductแต่จะproduct_id_seqเป็นแบบนั้น (นั่นคือ${table}_${column}_seq)

นี่คือALTER SEQUENCEคำสั่งที่คุณต้องการ:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

คุณสามารถดูลำดับในฐานข้อมูลของคุณโดยใช้\dsคำสั่งใน psql หากคุณทำ\d productและดูข้อ จำกัด เริ่มต้นสำหรับคอลัมน์ของคุณการnextval(...)โทรจะระบุชื่อลำดับด้วย


66
มันไม่ชัดเจนจากข้อความนี้ว่าไวยากรณ์ที่ถูกต้องคืออะไร มันคือ: เปลี่ยนลำดับ 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

ไม่มีใครรู้ว่าทำไมการเปลี่ยนแปลงลำดับ product_id_seq รีสตาร์ทด้วย (SELECT สูงสุด (id) จากผลิตภัณฑ์); ใช้งานไม่ได้? วิธีเดียวที่ฉันพบคือใช้แบบสอบถามที่แยกกันสองรายการ
Chris Huang-Leaver

8
โปรดทราบว่าค่าที่คุณรีสตาร์ทด้วยเป็นค่าถัดไปที่คุณต้องการใช้ ดังนั้นหากคุณมีบันทึกรหัสคุณควร1453 RESTART WITH 1454
hughes

144

นี่คือคำสั่งที่คุณกำลังค้นหาสมมติว่าลำดับของคุณสำหรับตารางผลิตภัณฑ์คือ product_id_seq:

แก้ไขลำดับ product_id_seq รีสตาร์ทด้วย 1453;


130

คำสั่งต่อไปนี้ทำสิ่งนี้ให้คุณโดยอัตโนมัติ: สิ่งนี้จะลบข้อมูลทั้งหมดในตารางด้วย ดังนั้นระวัง

TRUNCATE TABLE someTable RESTART IDENTITY;

21
ระวัง - นี่จะเป็นการลบข้อมูลทั้งหมดของคุณเช่นกัน
kibibu

28
@ Loolooii เพียงแค่ตั้งค่าสถานะ; ถ้ามีคนที่ไม่คุ้นเคยกับ SQL กำลังค้นหาที่นี่เพราะพวกเขาเพิ่มแถวลงในตารางด้วยตนเองโดยมีฟิลด์ autoincrement (ผ่าน ORM เป็นต้น) วิธีนี้อาจไม่ใช่วิธีที่พวกเขาคาดหวัง
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ที่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, เท็จ) จากนั้น (1, จริง), (2, จริง), ... 2 ดังนั้น MAX (id) + 1 ควรเป็น MAX (id) แทนเพื่อไม่ข้าม ID
สิบ

ฉันต้องรีสตาร์ทอินสแตนซ์ postgres เพื่อให้สามารถใช้งานได้ brew services restart postgresql
BigRon

เลือก SETVAL ('project_id_seq', (SELECT MAX (id) + 1 จากโครงการ)); ทำงานได้อย่างสมบูรณ์ แต่มีวิธีรีเซ็ตค่าการเพิ่มเป็น 0 ดังนั้นรายการใหม่เริ่มต้นด้วยดัชนี 0 หรือไม่
Charith Jayasanka

13

แปลงจากความคิดเห็นเพื่อความสะดวกของผู้เข้าชม

มันไม่ชัดเจนจากข้อความนี้ว่าไวยากรณ์ที่ถูกต้องคืออะไร มันคือ:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

6

หากคุณต้องการรีเซ็ตการเพิ่มขึ้นอัตโนมัติจาก GUI ให้ทำตามขั้นตอนนี้

  1. ไปที่ฐานข้อมูลของคุณ
  2. คลิกที่สาธารณะ
  3. ในหน้ารายการตารางคุณสามารถเห็นแท็บเช่น 'ตาราง', 'มุมมอง', 'ลำดับ' เช่นนั้น
  4. คลิกที่ลำดับ
  5. เมื่อคุณคลิกที่ 'ลำดับ' คุณจะเห็นรายการลำดับทั้งหมดคลิกที่สิ่งที่คุณต้องการรีเซ็ต
  6. หลังจากนั้นคุณจะเห็นหลายตัวเลือกเช่น 'แก้ไข', 'กำหนดค่า', 'เริ่มใหม่', 'รีเซ็ต' ฯลฯ ...
  7. จากนั้นคลิกที่รีเซ็ตจากนั้นเพิ่มหนึ่งแถวใหม่

6

หากคุณมีตารางที่มีคอลัมน์ประจำตัวที่คุณต้องการรีเซ็ตค่าถัดไปเพื่อให้คุณสามารถใช้คำสั่งต่อไปนี้:

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

1
หนึ่ง + สำหรับการใช้งานในกรณีที่ไม่มีsequenceหรือคุณไม่สามารถตัดทอนตารางได้ ฉันคิดว่ามันเป็นคำตอบที่ดีที่สุด
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

เพื่อให้ได้รหัสการใช้งาน

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

สิ่งนี้จะทำให้คุณมีรหัสsequesceเป็นtableName_ColumnName_seq

ในการรับหมายเลขเมล็ดพันธุ์สุดท้ายใช้

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

หรือถ้าคุณรู้รหัสลำดับใช้งานโดยตรง

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.