เหตุใดตารางจึงใช้คีย์หลักเป็นคีย์ต่างประเทศเพื่อตัวของมันเอง


21

เมื่อดูจากฐานข้อมูลฉันเจอตารางที่ใช้คีย์หลักเป็นรหัสต่างประเทศกับตัวเอง

ฉันเคยเห็นว่าตารางสามารถมี foreign key เป็นของตัวเองเพื่อสร้างโครงสร้างลำดับชั้น แต่จะใช้คอลัมน์อื่นเพื่ออ้างอิงคีย์หลัก

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

มีเหตุผลใดที่จะทำเช่นนี้?

ตารางเข้าร่วมกับตัวเอง

ฉันมั่นใจว่าข้อ จำกัด นั้นถูกเขียนขึ้นมาอย่างนั้น (ไม่ใช่แค่ดูที่แผนภาพ) เพราะตารางและคอลัมน์เดียวกันนั้นถูกใช้สำหรับคำจำกัดความทั้งสองครึ่ง


6
อาจเป็นไปได้ว่าการใช้มือของนักออกแบบเป็นทฤษฎีของฉัน
Martin Smith

คำตอบ:


28

อย่างที่คุณพูด FOREIGN KEYจำกัด อ้างอิงตารางเดียวกันเป็นปกติสำหรับโครงสร้างลำดับชั้นและมันจะใช้คอลัมน์อื่นเพื่ออ้างอิงคีย์หลัก ตัวอย่างที่ดีคือตารางพนักงาน:

EmployeeId    Int     Primary Key
EmployeeName  String
ManagerId     Int     Foreign key going back to the EmployeeId

ดังนั้นในกรณีนี้มีคีย์ต่างประเทศจากตารางกลับไปที่ตัวเอง ผู้จัดการทุกคนนอกจากนี้ยังมีพนักงานเพื่อให้ManagerIdเป็นจริงEmployeeIdของผู้จัดการ

ตอนนี้ในมืออื่น ๆ ถ้าคุณมีคนเฉลี่ยใช้EmployeeIdเป็นปุ่มย้อนกลับต่างประเทศเพื่อตาราง Employee แล้วมันอาจจะเป็นความผิดพลาด ฉันทำการทดสอบและเป็นไปได้ แต่ก็ไม่มีประโยชน์อะไรเลย

CREATE TABLE Employee (EmployeeId Int PRIMARY KEY,
                        EmployeeName varchar(50),
                        ManagerId Int);


ALTER TABLE Employee ADD CONSTRAINT fk_employee 
    FOREIGN KEY (EmployeeId) REFERENCES Employee(EmployeeId);

1
การวางข้อ จำกัด ใน ManagerId ที่เกี่ยวข้องกับ EmployeeId ในกรณีนี้อาจเป็นประโยชน์ถ้าผู้จัดการต้องถูก "แยก" มันจะไม่อนุญาตให้ลบแถวหากตั้งค่าด้วยวิธีนี้ ไม่ได้บอกว่าฉันจะทำแบบนั้น แต่มันอาจมีประโยชน์บางอย่างหากใบสมัครของคุณขึ้นอยู่กับพนักงานที่มีผู้จัดการ
zgr024

6

ฉันเพิ่งพบกุญแจต่างประเทศในฐานข้อมูลของฉันเองและมันต้องสร้างด้วยตัวเอง ฉันคิดว่ามันเกิดขึ้นโดยบังเอิญ ถ้าฉันคลิกที่ "New Foreign Key" ในเมนูบริบทของตารางที่มีคีย์หลัก (ภายใน Management Studio, SQL 2014 Express) สิ่งนี้จะสร้างรหัสต่างประเทศที่อ้างอิงตัวเองโดยอัตโนมัติ ดูด้านล่าง:

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

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

ดังนั้นสำหรับฉันเช่นนั้น Foreign Key ไม่สมเหตุสมผลและสามารถลบออกได้


เป็นไปได้ว่าคุณต้องการสร้าง FK และในกระบวนการที่คุณทราบว่าตารางอื่นยังไม่ได้ตั้งค่า PK ดังนั้นคุณจึงยกเลิกไปที่ตารางอื่นจากนั้นด้วยเหตุผลบางอย่างที่คุณลืมกระบวนการ FK ต่อไป ที่นั่นคุณมี FK แบบเรียกซ้ำ
Andrew

4

บางทีผู้ออกแบบต้องการที่จะปิดการใช้งานTRUNCATE TABLE?

TRUNCATE TABLEไม่สามารถใช้บนตารางที่มีข้อ จำกัด foreign key ไปยังตารางอื่นแม้ว่าจะสามารถใช้งานได้หากมีForeign Key ที่อ้างอิงตัวเอง จากเอกสารประกอบสำหรับTRUNCATE TABLE (Transact-SQL) :

สารสกัด BOL

DELETEคำสั่งโดยไม่มีWHEREข้อมีผลคล้ายกับTRUNCATE TABLE(ลบแถวทั้งหมดในตาราง) แต่DELETEคำสั่งไฟทริกเกอร์ลบซึ่งอาจจะเป็นเหตุผลที่จะอนุญาตให้แต่ไม่DELETETRUNCATE TABLE

ฉันจะทำเช่นนี้โดยใช้สิทธิ์ ( DELETEต้องมีสิทธิ์ลบTRUNCATE TABLEต้องแก้ไขสิทธิ์ตาราง) แต่อาจมีเหตุผลบางอย่างที่นักออกแบบไม่สามารถทำได้?

หมายเหตุ:แม้ว่าสิ่งที่ผู้ออกแบบทำไม่ได้ปิดการใช้งานจริง ๆTRUNCATE TABLEฉันก็ยังคาดการณ์ว่านี่เป็นความตั้งใจของพวกเขา

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