วิธีการตั้งค่าคีย์หลักที่เพิ่มขึ้นอัตโนมัติใน PostgreSQL


259

ฉันมีตารางใน PostgreSQL ที่มี 22 คอลัมน์และฉันต้องการเพิ่มคีย์หลักที่เพิ่มขึ้นอัตโนมัติ

ฉันพยายามสร้างคอลัมน์ชื่อidประเภท BIGSERIAL แต่ pgadmin ตอบกลับด้วยข้อผิดพลาด:

ERROR: sequence must have same owner as table it is linked to.

ไม่มีใครรู้วิธีแก้ไขปัญหานี้หรือไม่ ฉันจะเพิ่มการสร้างคีย์หลักที่เพิ่มขึ้นอัตโนมัติใน PostgreSQL โดยไม่ต้องสร้างตารางอีกครั้งได้อย่างไร

คำตอบ:


292

ลองคำสั่งนี้:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

ลองกับผู้ใช้ฐานข้อมูลเดียวกับที่คุณสร้างตาราง


75
(กุญแจสำคัญที่นี่คือการใช้อนุกรมหรือ BIGSERIAL ชนิดข้อมูลซึ่งจะสร้างลำดับฉากหลังและเพิ่มทีละ / การใช้งานได้ตลอดเวลาแทรก)
rogerdpack

16
และถ้าคุณต้องการอ้างอิงจากตารางอื่นให้ใช้จำนวนเต็มหรือ bigint
Ward

2
@satishkilari: ALTER TABLE mytable ADD PRIMARY KEY (column);ใช่ไวยากรณ์คือ Postgresql จะตรวจสอบว่าคอลัมน์ไม่มีค่า NULL
AH

3
รับข้อผิดพลาดนี้ใน pgAdmin 4. ทั้งคู่bigserialและserialให้ข้อผิดพลาดเดียวกัน:ERROR: syntax error at or near "BIGSERIAL"
adi

5
ได้รับข้อผิดพลาดทางไวยากรณ์โดยใช้ bigserial หรือ serial มีรูปแบบ postgresql ขั้นต่ำสำหรับสิ่งนี้หรือไม่?
dacDave

251

การเพิ่มคีย์หลักอัตโนมัติใน postgresql:

ขั้นตอนที่ 1 สร้างตารางของคุณ:

CREATE TABLE epictable
(
    mytable_key    serial primary key,
    moobars        VARCHAR(40) not null,
    foobars        DATE
);

ขั้นตอนที่ 2 แทรกค่าลงในตารางของคุณเช่นนี้สังเกตว่า mytable_key ไม่ได้ระบุไว้ในรายการพารามิเตอร์แรกซึ่งทำให้ลำดับเริ่มต้นคือการรวมอัตโนมัติ

insert into epictable(moobars,foobars) values('delicious moobars','2012-05-01')
insert into epictable(moobars,foobars) values('worldwide interblag','2012-05-02')

ขั้นตอนที่ 3 เลือก * จากตารางของคุณ:

el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable"

ขั้นตอนที่ 4 ตีความผลลัพธ์:

mytable_key  |        moobars        |  foobars   
-------------+-----------------------+------------
           1 | delicious moobars     | 2012-05-01
           2 | world wide interblags | 2012-05-02
(2 rows)

สังเกตว่าคอลัมน์ mytable_key มีการเพิ่มค่าอัตโนมัติ

protip:

คุณควรใช้คีย์หลักบนโต๊ะของคุณเสมอเพราะ postgresql ใช้โครงสร้างตารางแฮชเพื่อเพิ่มความเร็วของการแทรกการลบการอัพเดตและการเลือกภายใน หากมีคอลัมน์หลักหลัก (ซึ่งถูกบังคับให้มีลักษณะเฉพาะและไม่เป็นโมฆะ) ก็สามารถขึ้นอยู่กับว่าจะให้เมล็ดพันธุ์ที่ไม่ซ้ำสำหรับฟังก์ชันแฮช หากไม่มีคอลัมน์คีย์หลักฟังก์ชันแฮชจะไม่มีประสิทธิภาพเนื่องจากจะเลือกคอลัมน์ชุดอื่นเป็นคีย์


21
nitpick เล็กน้อยSERIALสร้างsequenceฉากหลัง: postgresql.org/docs/9.2/static/ ......
carbocation

1
เป็นไปได้หรือไม่ที่จะสร้างคีย์หลัก (คอลัมน์ที่มีอยู่) ในตารางโดยไม่ต้องเพิ่มคอลัมน์ใหม่
satish kilari

รหัสต่างประเทศจะประกาศให้thing_id int references epictable(mytable_key)ทำงานได้อย่างไร

36

สร้างคีย์หลักที่เพิ่มขึ้นอัตโนมัติใน postgresql โดยใช้ลำดับที่กำหนดเอง:

ขั้นตอนที่ 1 สร้างลำดับของคุณ:

create sequence splog_adfarm_seq
    start 1
    increment 1
    NO MAXVALUE
    CACHE 1;
ALTER TABLE fact_stock_data_detail_seq
OWNER TO pgadmin;

ขั้นตอนที่ 2 สร้างตารางของคุณ

CREATE TABLE splog_adfarm
(
    splog_key    INT unique not null,
    splog_value  VARCHAR(100) not null
);

ขั้นตอนที่ 3 แทรกลงในตารางของคุณ

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Is your family tree a directed acyclic graph?'
);

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Will the smart cookies catch the crumb?  Find out now!'
);

ขั้นตอนที่ 4 สังเกตแถว

el@defiant ~ $ psql -U pgadmin -d kurz_prod -c "select * from splog_adfarm"

splog_key |                            splog_value                             
----------+--------------------------------------------------------------------
        1 | Is your family tree a directed acyclic graph?
        2 | Will the smart cookies catch the crumb?  Find out now!
(3 rows)

สองแถวมีปุ่มที่เริ่มต้นที่ 1 และเพิ่มขึ้น 1 ตามที่กำหนดโดยลำดับ

เคล็ดลับยอดโบนัส:

โปรแกรมเมอร์เกลียดการพิมพ์และการพิมพ์ออกมาnextval('splog_adfarm_seq')นั้นน่ารำคาญ คุณสามารถพิมพ์DEFAULTพารามิเตอร์นั้นแทนเช่นนี้

insert into splog_adfarm values (
    DEFAULT, 
    'Sufficient intelligence to outwit a thimble.'
);

เพื่อให้การทำงานด้านบนคุณต้องกำหนดค่าเริ่มต้นสำหรับคอลัมน์คีย์นั้นในตาราง splog_adfarm อันไหนสวยกว่ากัน


2
ประโยชน์ของลำดับที่กำหนดเองคืออะไร น่าจะปลอดภัยหรือไม่?
LéoLéopold Hertz 준영

1
@Masi การใช้ลำดับที่กำหนดเองเพียงครั้งเดียวอาจทำให้การจำลองข้อมูลต้นแบบง่ายขึ้นซึ่งจะมีประโยชน์หากการเชื่อมโยงข้อมูลระหว่างศูนย์ข้อมูลสองศูนย์เสีย จากนั้นทำให้ง่ายต่อการซิงค์ฐานข้อมูลในขณะที่รักษารหัสที่สร้างขึ้นในสถานที่แยกต่างหาก
Vincent McNabb

16

หากคุณต้องการทำสิ่งนี้ใน pgadmin มันง่ายกว่ามาก ดูเหมือนว่าใน postgressql เพื่อเพิ่มการเพิ่มอัตโนมัติในคอลัมน์ก่อนอื่นเราต้องสร้างลำดับการเพิ่มอัตโนมัติและเพิ่มลงในคอลัมน์ที่ต้องการ ฉันทำอย่างนี้

1) ประการแรกคุณต้องแน่ใจว่ามีคีย์หลักสำหรับตารางของคุณ เก็บประเภทข้อมูลของคีย์หลักไว้ด้วยสีใหญ่หรือเล็ก (ฉันใช้ bigint ไม่พบประเภทข้อมูลที่เรียกว่า serial ตามที่กล่าวไว้ในคำตอบอื่น ๆ )

2) จากนั้นใส่ลำดับโดยคลิกขวาที่ sequence-> เพิ่มลำดับใหม่ หากไม่มีข้อมูลในตารางให้ปล่อยตามลำดับอย่าทำการเปลี่ยนแปลงใด ๆ เพียงบันทึกไว้ หากมีข้อมูลอยู่ให้เพิ่มค่าสุดท้ายหรือค่าสูงสุดในคอลัมน์คีย์หลักให้กับค่าปัจจุบันในแท็บคำจำกัดความที่แสดงด้านล่าง ป้อนคำอธิบายรูปภาพที่นี่

3) ในที่สุดเพิ่มบรรทัดnextval('your_sequence_name'::regclass)เป็นค่าเริ่มต้นในคีย์หลักของคุณที่แสดงด้านล่าง

ป้อนคำอธิบายรูปภาพที่นี่ ตรวจสอบให้แน่ใจว่าชื่อลำดับถูกต้องที่นี่ นี่คือทั้งหมดและการเพิ่มอัตโนมัติควรทำงาน


9

หากคุณต้องการใช้ตัวเลขในลำดับกำหนดลำดับใหม่ด้วยสิ่งที่ชอบ

CREATE SEQUENCE public.your_sequence
    INCREMENT 1
    START 1
    MINVALUE 1
;

จากนั้นแก้ไขตารางเพื่อใช้ลำดับสำหรับ id:

ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass);

ฉันต้องสร้างลำดับใหม่สำหรับทุกตารางหรือไม่
Bharat Chhabra

คุณสามารถแชร์ลำดับเดียวกันสำหรับตารางที่แตกต่างกัน แต่ลำดับจะเพิ่มขึ้นสำหรับแต่ละระเบียนในแต่ละตาราง
acaruci

1

ฉันได้ลองใช้สคริปต์ต่อไปนี้เพื่อเพิ่มคีย์หลักใน PostgreSQL ให้สำเร็จโดยอัตโนมัติ

CREATE SEQUENCE dummy_id_seq
    START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

CREATE table dummyTable (
    id bigint DEFAULT nextval('dummy_id_seq'::regclass) NOT NULL,
    name character varying(50)
);

แก้ไข:

CREATE table dummyTable (
    id SERIAL NOT NULL,
    name character varying(50)
)

คำหลัก SERIAL สร้างลำดับสำหรับคอลัมน์ที่เกี่ยวข้องโดยอัตโนมัติ


คุณสามารถรีเซ็ตซีเรียลอย่างที่คุณทำเพื่อเป็นลำดับได้ไหม?
thoroc

1
ใช่! ฉันได้ตรวจสอบALTER SEQUENCE dummytable_id_seq RESTART WITH 1;และใช้งานได้แล้ว
Asad Shakeel

0

บางทีฉันอาจจะสายเกินไปที่จะตอบคำถามนี้ แต่ฉันกำลังทำงานในหัวข้อนี้ที่งานของฉัน :)

ฉันต้องการเขียนคอลัมน์ 'a_code' = c1, c2, c3, c4 ...

ประการแรกผมเปิดคอลัมน์ที่มีชื่อและชนิดref_id serialจากนั้นฉันแก้ไขปัญหาด้วยคำสั่งนี้:

update myschema.mytable set a_code=cast('c'||"ref_id" as text) 

เป็นไปได้หรือไม่ที่จะสร้างคีย์หลัก (คอลัมน์ที่มีอยู่) ในตารางโดยไม่ต้องเพิ่มคอลัมน์ใหม่
satish kilari
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.