ดัชนีที่ไม่ซ้ำกันกรองเป็นความคิดที่ยอดเยี่ยม แต่มันก็มีข้อเสียเล็ก ๆ น้อย ๆ - ไม่ว่าคุณจะใช้เงื่อนไขหรือWHERE identity_column > <current value>
WHERE identity_column NOT IN (<list of ids for duplicate values here>)
ด้วยวิธีแรกคุณจะยังสามารถแทรกข้อมูลที่ซ้ำกันในอนาคตข้อมูลที่มีอยู่ (ตอนนี้) ที่ซ้ำกัน ตัวอย่างเช่นหากคุณมีแถว (แม้แต่แถวเดียว) ในตอนนี้CompanyName = 'Software Inc.'
ดัชนีจะไม่ห้ามการแทรกแถวอีกหนึ่งแถวที่มีชื่อ บริษัท เดียวกัน มันจะห้ามเท่านั้นถ้าคุณลองสองครั้ง
ด้วยวิธีที่สองมีการปรับปรุงข้างต้นจะไม่ทำงาน (ซึ่งก็ดี) อย่างไรก็ตามคุณจะยังสามารถแทรกรายการที่ซ้ำกันมากขึ้นหรือรายการซ้ำที่มีอยู่ ตัวอย่างเช่นหากคุณมีแถว (สองแถวขึ้นไป) ตอนนี้CompanyName = 'DoubleData Co.'
ดัชนีจะไม่ห้ามการแทรกแถวอีกหนึ่งแถวที่มีชื่อ บริษัท เดียวกัน มันจะห้ามเท่านั้นถ้าคุณลองสองครั้ง
(อัปเดต)สิ่งนี้สามารถแก้ไขได้หากชื่อซ้ำกันทุกรายการคุณจะไม่อยู่ในรายการยกเว้นหนึ่ง ID ถ้าเช่นเดียวกับตัวอย่างข้างต้นมี 4 แถวที่ซ้ำกันCompanyName = DoubleData Co.
และรหัส4,6,8,9
รายการยกเว้นควรมีเพียง 3 จาก ID เหล่านี้
ด้วยวิธีที่สองข้อเสียเปรียบอีกประการหนึ่งคือสภาพที่ยุ่งยาก (จำนวนยุ่งยากนั้นขึ้นอยู่กับจำนวนที่ซ้ำกันที่มีอยู่ในตอนแรก) เนื่องจาก SQL-Server ดูเหมือนว่าจะไม่สนับสนุนNOT IN
ผู้ประกอบการในWHERE
ส่วนของดัชนีกรอง ดูแบบ SQL ซอ แทนที่จะเป็นอย่างWHERE (CompanyID NOT IN (3,7,4,6,8,9))
นั้นคุณจะต้องมีอะไรบางอย่างเช่นWHERE (CompanyID <> 3 AND CompanyID <> 7 AND CompanyID <> 4 AND CompanyID <> 6 AND CompanyID <> 8 AND CompanyID <> 9)
ฉันไม่แน่ใจว่ามีผลกระทบอย่างมีประสิทธิภาพกับเงื่อนไขดังกล่าวหรือไม่ถ้าคุณมีชื่อซ้ำหลายร้อยชื่อ
โซลูชันอื่น (คล้ายกับ @Alex Kuznetsov's) คือการเพิ่มคอลัมน์อื่นเติมด้วยหมายเลขอันดับและเพิ่มดัชนีที่ไม่ซ้ำซึ่งรวมถึงคอลัมน์นี้:
ALTER TABLE Company
ADD Rn TINYINT DEFAULT 1;
UPDATE x
SET Rn = Rnk
FROM
( SELECT
CompanyID,
Rn,
Rnk = ROW_NUMBER() OVER (PARTITION BY CompanyName
ORDER BY CompanyID)
FROM Company
) x ;
CREATE UNIQUE INDEX CompanyName_UQ
ON Company (CompanyName, Rn) ;
จากนั้นการแทรกแถวที่มีชื่อซ้ำกันจะล้มเหลวเนื่องจากDEFAULT 1
คุณสมบัติและดัชนีที่ไม่ซ้ำกัน สิ่งนี้ยังไม่สามารถป้องกันได้ 100% (ขณะที่อเล็กซ์เป็น) รายการที่ซ้ำกันจะยังคงลื่นไหลหากRn
มีการตั้งค่าไว้อย่างชัดเจนในINSERT
คำสั่งหรือหากRn
มีการปรับปรุงค่าที่ประสงค์ร้าย
SQL-ซอ-2