ข้อ จำกัด ของคอลัมน์ที่ไม่ซ้ำกันที่กำหนดเองมีผลบังคับใช้เฉพาะถ้าหนึ่งคอลัมน์มีค่าเฉพาะ


19

เป็นไปได้หรือไม่ที่จะมีข้อ จำกัด คอลัมน์เฉพาะที่กำหนดเองดังต่อไปนี้ สมมติว่าฉันมีสองคอลัมน์subsetและtypeทั้งสองสตริง (แม้ว่าชนิดข้อมูลอาจไม่สำคัญ)

ถ้าtypeเป็น "จริง" ฉันก็อยากจะผสมผสานtypeและsubsetเป็นเอกลักษณ์ มิฉะนั้นจะไม่มีข้อ จำกัด ฉันใช้ PostgreSQL 8.4 บนเดเบียน


คำตอบ:


31

ในคำอื่น ๆ ที่คุณต้องการจะไม่ซ้ำกันถ้าsubset ดัชนีที่ไม่ซ้ำบางส่วนจะทำ:type = 'true'

CREATE UNIQUE INDEX tbl_some_name_idx ON tbl (subset) WHERE type = 'true';

วิธีนี้คุณสามารถสร้างชุดค่าผสมที่NULLไม่ซ้ำกันซึ่งไม่สามารถทำได้ - ดังรายละเอียดในคำตอบที่เกี่ยวข้องนี้:
ข้อ จำกัด เฉพาะหลายคอลัมน์ของ PostgreSQL และค่า NULL


ขอบคุณเออร์วิน ฉันไม่เห็นตัวเลือกนี้เมื่อฉันดูเอกสาร การเชื่อมโยงโดยตรงมากขึ้นเป็นpostgresql.org/docs/current/interactive/indexes-partial.html ดูตัวอย่างที่ 11-3
Faheem Mitha

@FaheemMitha: ฉันเชื่อมโยงหนึ่งระดับที่สูงขึ้นเนื่องจากคุณจำเป็นต้องรวมดัชนีบางส่วนกับดัชนีที่ไม่ซ้ำ
Erwin Brandstetter

1
@Erwin หน้านั้น (เกี่ยวกับดัชนีบางส่วน) มีตัวอย่างที่มีดัชนีเฉพาะบางส่วน
ypercubeᵀᴹ

@ypercube: อ่าใช่มั้ย นั่นคือลิงค์ที่ดีกว่า ฉันเปลี่ยนคำตอบให้ชี้ไปที่บทสุดท้าย
Erwin Brandstetter

6

นี่เป็นส่วนเสริมของคำตอบของ Erwin ด้านบน แต่ PostgreSQL รองรับดัชนีหลายประเภท สิ่งเหล่านี้ไม่ได้เกิดร่วมกันโดยเฉพาะ คุณสามารถคิดว่าสิ่งเหล่านี้เป็น:

  • วิธีการทำดัชนี (btree, GiST, GIN, ฯลฯ ) เลือกหนึ่งรายการถ้าจำเป็น (btree เป็นค่าเริ่มต้น)
  • บางส่วนหรือเต็ม หากบางส่วนใช้ส่วนคำสั่งที่
  • โดยตรงหรือใช้งานได้ คุณสามารถจัดทำดัชนีผลลัพธ์ของฟังก์ชัน
  • ไม่ซ้ำหรือไม่ซ้ำกัน

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

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

CREATE INDEX my_index_name_idx_u ON tbl (lower(subset)) WHERE type;

หมายเหตุนี้สร้างดัชนีที่ไม่ซ้ำกันในการส่งออกของฟังก์ชั่นลดลง () ที่เรียกว่าในแอตทริบิวต์ชุดย่อยที่ประเภทเป็นจริง


ดังนั้นดัชนีในคำตอบของเออร์วินจึงตรงในขณะที่หนึ่งในตัวอย่างของคุณใช้งานได้ถูกต้อง?
Faheem Mitha

@FaheemMitha: ถูกต้อง
Erwin Brandstetter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.