PostgreSQL: ชื่อข้อ จำกัด เริ่มต้น


88

เมื่อสร้างตารางใน PostgreSQL ชื่อข้อ จำกัด เริ่มต้นจะถูกกำหนดหากไม่ได้ระบุ:

CREATE TABLE example (
    a integer,
    b integer,
    UNIQUE (a, b)
);

แต่การใช้ALTER TABLEเพื่อเพิ่มข้อ จำกัด ดูเหมือนว่าชื่อจำเป็น:

ALTER TABLE example ADD CONSTRAINT my_explicit_constraint_name UNIQUE (a, b);

สิ่งนี้ทำให้การตั้งชื่อบางอย่างไม่สอดคล้องกันในโครงการที่ฉันทำและถามคำถามต่อไปนี้:

  1. มีวิธีง่ายๆในการเพิ่มข้อ จำกัด ให้กับตารางที่ยังหลงเหลืออยู่ด้วยชื่อที่จะได้รับหากเพิ่มระหว่างการสร้างตารางหรือไม่?

  2. ถ้าไม่ควรหลีกเลี่ยงชื่อเริ่มต้นทั้งหมดเพื่อป้องกันความไม่สอดคล้องกัน?


3
ฉันตั้งเป็นกฎเพื่อหลีกเลี่ยงชื่อเริ่มต้นด้วยเหตุผลนี้ - คุณจบลงด้วยสถานการณ์ที่ในการปรับใช้ทุกข้อ จำกัด มีชื่อที่แตกต่างกัน
Paul Tomblin

คำตอบ:


36

คู่มือสวยใสเกี่ยวกับเรื่องนี้ ( " tableconstraint: รูปแบบนี้จะเพิ่มข้อ จำกัด ใหม่ในตารางโดยใช้ไวยากรณ์เช่นเดียวกับสร้างตาราง. ")

ดังนั้นคุณสามารถเรียกใช้:

แก้ไขตารางตัวอย่างเพิ่ม UNIQUE (a, b);

5
อา! ฉันเข้าใจผิดรวมถึงCONSTRAINTชอบALTER TABLE example ADD CONSTRAINT UNIQUE (a, b);และได้รับข้อผิดพลาด ขอขอบคุณ!
Ian Mackinnon

282

ชื่อมาตรฐานสำหรับดัชนีใน PostgreSQL คือ:

{tablename}_{columnname(s)}_{suffix}

โดยคำต่อท้ายเป็นอย่างใดอย่างหนึ่งต่อไปนี้:

  • pkey สำหรับข้อ จำกัด ของคีย์หลัก
  • key สำหรับข้อ จำกัด เฉพาะ
  • excl สำหรับข้อ จำกัด การยกเว้น
  • idx สำหรับดัชนีประเภทอื่น ๆ
  • fkey สำหรับคีย์ต่างประเทศ
  • check สำหรับข้อ จำกัด ในการตรวจสอบ

คำต่อท้ายมาตรฐานสำหรับลำดับคือ

  • seq สำหรับลำดับทั้งหมด

หลักฐานข้อ จำกัด ที่ไม่เหมือนใครของคุณ:

ข้อสังเกต: CREATE TABLE / UNIQUE จะสร้างดัชนีโดยปริยาย "example_a_b_key" สำหรับตาราง "example"


10
มีประโยชน์มากขอบคุณ! ควรเพิ่มที่ Foreign Key ใช้คำต่อท้ายfkeyและข้อ จำกัด ของคีย์ต่างประเทศแบบหลายคอลัมน์ดูเหมือนจะรวมชื่อคอลัมน์แรกเท่านั้น
Ian Mackinnon

1
@IanMackinnon นี่น่าจะเป็นคำตอบที่ดีที่สุด!
Marcio Mazzucato

ข้อมูลนี้เป็นสีทอง! คุณสามารถยืนยันได้โดยเรียกใช้เช่นCREATE TABLE mytable (mycolumn numeric UNIQUE);
jmagnusson

6
คำตอบที่ฉันกำลังมองหาเมื่อ googling "หลักการตั้งชื่อดัชนี postgresql"
แฟนซีจอห์น

1
@someone อาขอโทษฉันเดาว่าฉันหมายถึงจุดสิ้นสุดของคำสั่งยูทิลิตี้ E.4.3.3 เป็นรายการสัญลักษณ์แสดงหัวข้อย่อยสุดท้ายก่อน E.4.3.4 ประเภทข้อมูล: "ใช้ชื่อคอลัมน์หลักทั้งหมดเมื่อเลือกชื่อข้อ จำกัด เริ่มต้นสำหรับคีย์ต่างประเทศ (Peter Eisentraut)"
Michael Hewson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.