การใช้คีย์ต่างประเทศหลายรายการในคอลัมน์เดียวกันใน SQL Server


10

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

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:


12

ไม่มีประโยชน์ที่จะมีข้อ จำกัด ที่ซ้ำซ้อนที่แตกต่างกันตามชื่อเท่านั้น ในทำนองเดียวกันไม่มีประโยชน์ที่จะมีดัชนีซ้ำซ้อนที่แตกต่างกันตามชื่อเท่านั้น ทั้งสองเพิ่มค่าใช้จ่ายโดยไม่มีค่า

เอ็นจินฐานข้อมูล SQL Server ไม่ได้หยุดคุณจากการทำเช่นนั้น ข้อตกลงการตั้งชื่อข้อ จำกัด ที่ดี (เช่น FK_ReferencingTable_ReferencedTable) สามารถช่วยป้องกันข้อผิดพลาดดังกล่าวได้


17

SQL Server ช่วยให้คุณทำสิ่งที่โง่มาก

คุณสามารถสร้างคีย์ต่างประเทศในคอลัมน์ที่อ้างอิงตัวเองได้แม้ว่าข้อเท็จจริงนี้จะไม่ถูกละเมิดเนื่องจากทุกแถวจะตรงกับข้อ จำกัด ของตัวเอง

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

(ดังตัวอย่างด้านล่าง)

CREATE TABLE T1(
    T1_Id INT PRIMARY KEY CLUSTERED  NOT NULL,
    Filler CHAR(4000) NULL,
) 

INSERT INTO T1 VALUES (1, '');

CREATE TABLE T2(
    T2_Id INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
    T1_Id INT NOT NULL CONSTRAINT FK REFERENCES T1 (T1_Id), 
    Filler CHAR(4000) NULL,
)


ALTER TABLE T1 ADD CONSTRAINT
    UQ_T1 UNIQUE NONCLUSTERED(T1_Id) 


/*Execution Plan uses clustered index*/ 
INSERT INTO T2 VALUES (1,1) 

ALTER TABLE T2  WITH CHECK ADD  CONSTRAINT FK2 FOREIGN KEY(T1_Id)
REFERENCES T1 (T1_Id)    

ALTER TABLE T2 DROP CONSTRAINT FK

/*Now Execution Plan now uses non clustered index*/    
INSERT INTO T2 VALUES (1,1)    

DROP TABLE  T2, T1;

ในฐานะที่เป็นกันสำหรับช่วงเวลาระหว่างที่ในขณะที่ข้อ จำกัด ทั้งสองมีอยู่แทรกใด ๆ ท้ายถูกตรวจสอบกับดัชนีทั้งสอง


สามารถใช้ธุรกรรมเพื่อให้แน่ใจว่าการปรับปรุงข้อ จำกัด ที่ไม่มีช่องว่างเดียวกันได้หรือไม่ วิธีนี้ไม่ใช่วิธีการทำธุรกรรมที่ดีกว่าเนื่องจากล็อคน้อยกว่าหรือเปล่า?
binki

13

ไม่มีประโยชน์สำหรับการมีข้อ จำกัด foreign key ที่เหมือนกันซึ่งอยู่ในคอลัมน์เดียวกันและอ้างอิงตารางและคอลัมน์เดียวกัน

มันเหมือนมีเช็คเดียวกัน 2 ครั้งขึ้นไป


-ไม่เห็นด้วย. อาจเป็นไปได้ว่าตารางหลักต้องการการตรวจสอบสองครั้งแยกกัน ดูตัวอย่างด้านล่างผู้ส่งและผู้รับต่างกันโดยสิ้นเชิง - stackoverflow.com/questions/40400483/…
trex

@rex คุณกำลังพูดถึง somethign ที่แตกต่างกัน คำถามในที่นี้กล่าวว่า: "ฉันต้องการทราบว่าการใช้คีย์ต่างประเทศหลายอันซึ่งกำหนดไว้ในคอลัมน์เดียวกันและการอ้างอิงไปยังคอลัมน์เดียวกันในตารางอื่นคืออะไร"
ypercubeᵀᴹ

@ ypercubeᵀᴹ - เข้าใจแล้ว ขอบคุณที่ทำให้ชัดเจน
trex

6

เหตุผลเดียวกันที่คุณสามารถสร้างดัชนีได้ 50 ดัชนีในคอลัมน์เดียวกันเพิ่มไฟล์บันทึกชุดที่สองตั้งค่าหน่วยความจำเซิร์ฟเวอร์สูงสุดเป็น 20MB ... คนส่วนใหญ่จะไม่ทำสิ่งเหล่านี้ แต่อาจมีเหตุผลที่ถูกต้องที่จะทำในบางครั้ง ได้ประโยชน์ในการสร้างโอเวอร์เฮดในเครื่องยนต์เพื่อเพิ่มการตรวจสอบกับสิ่งที่ไม่เหมาะสม


2

ฟังดูเหมือนเป็นสีเขียวอมฟ้า

เมื่อคุณเริ่มตัดจากสีฟ้าเป็นสีเขียวคุณต้องสร้างสำเนาของสิ่งต่าง ๆ ชั่วคราว

สิ่งที่เราต้องการทำคือสร้างคีย์ต่างประเทศพิเศษชั่วคราวCHECK WITH NOCHECKและON UPDATE CASCADE ON DELETE SET NULL; สิ่งนี้คืออะไรมันเป็น foreign key ที่ใช้งานได้ แต่แถวที่มีอยู่จะไม่ถูกตรวจสอบเมื่อสร้าง key

หลังจากทำความสะอาดแถวทั้งหมดที่ควรจะตรงแล้วเราจะสร้าง foreign key ใหม่โดยไม่ใช้ตัวเลือกคำสั่งใด ๆ (โดยปกติCHECK WITH CHECKคือสิ่งที่คุณต้องการโดยทั่วไป) และวาง foreign key ชั่วคราว

โปรดสังเกตว่าหากคุณเพิ่งทำและสร้างรหัสต่างประเทศใหม่บางแถวของขยะอาจทำให้คุณพลาดได้

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