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

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

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

คีย์ต่างประเทศและคีย์หลัก

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

เมื่อเขตข้อมูลหนึ่งในตารางอ้างอิงถึงอีกเขตข้อมูลหนึ่ง จะเรียกว่าคีย์นอก และฟิลด์ที่อ้างถึงเรียกว่าคีย์หลัก ดังนั้นเขตข้อมูล snum ของตารางลูกค้าจึงเป็นคีย์ภายนอก และเขตข้อมูล snum ที่อ้างถึงในตารางผู้ขายจึงเป็นคีย์หลัก

ในทำนองเดียวกัน เขตข้อมูล cnum และ snum ของตารางใบสั่งซื้อเป็นคีย์นอกที่อ้างอิงถึงคีย์หลักที่มีชื่ออยู่ในตารางลูกค้าและตารางผู้จัดจำหน่าย ชื่อของคีย์ต่างประเทศและคีย์หลักไม่จำเป็นต้องเหมือนกัน มันเป็นเพียงแบบแผนที่เราปฏิบัติตามเพื่อทำให้การรวมชัดเจนยิ่งขึ้น

คีย์ต่างประเทศแบบหลายคอลัมน์

ในความเป็นจริง Foreign Key ไม่จำเป็นต้องประกอบด้วยเพศเดียวเสมอไป เช่นเดียวกับคีย์หลัก Foreign Key สามารถมีจำนวนฟิลด์เท่าใดก็ได้ ซึ่งทั้งหมดจะถือเป็นหน่วยเดียว คีย์ต่างประเทศและคีย์หลักที่อ้างถึงจะต้องมีหมายเลขและประเภทเพศเหมือนกัน และอยู่ในลำดับเดียวกัน คีย์ต่างประเทศที่ประกอบด้วยเพศเดียว - คีย์ที่เราใช้เฉพาะในตารางมาตรฐานของเราเป็นคีย์ที่พบบ่อยที่สุด เพื่อให้การสนทนาของเราง่ายขึ้น เรามักจะอ้างถึงคีย์ต่างประเทศเป็นคอลัมน์เดียว นี่ไม่ใช่เรื่องบังเอิญ หากไม่ได้ระบุไว้ ใครก็ตามจะพูดถึงฟิลด์ที่เป็นคีย์ต่างประเทศว่าฟิลด์นั้นอยู่ในกลุ่มของฟิลด์ที่เป็นคีย์นอกด้วย

ความหมายของกุญแจต่างประเทศและผู้ปกครอง

เมื่อเขตข้อมูลเป็นคีย์นอก เขตข้อมูลจะเกี่ยวข้องกับตารางที่เขตข้อมูลอ้างอิงถึงในทางใดทางหนึ่ง สิ่งที่คุณพูดเป็นหลักคือ "ทุกค่าในฟิลด์นี้ (คีย์นอก) เชื่อมโยงโดยตรงกับค่าในฟิลด์อื่น (คีย์หลัก)" แต่ละค่า (แต่ละแถว) ของคีย์ภายนอกจะต้องอ้างอิงถึงค่าเดียวเท่านั้น (แถว) ของคีย์หลักอย่างไม่คลุมเครือ หากเป็นกรณีนี้ ที่จริงแล้วระบบของคุณจะอยู่ในสภาพของการอ้างอิงที่สมบูรณ์ คุณสามารถดูสิ่งนี้ได้จากตัวอย่าง Foreign Key snum ในตารางลูกค้ามีค่า 1001 สำหรับแถว Hoffman และ Clemens สมมติว่าเรามีสองแถวในตารางผู้ขายโดยมีค่าฟิลด์ snum = 1001 เราจะรู้ได้อย่างไรว่าผู้ขายรายใดในสองรายที่ลูกค้า Hoffman และ Clemens ได้รับมอบหมายให้ ในทำนองเดียวกัน หากไม่มีแถวดังกล่าวในตารางผู้ขาย เราจะจบลงด้วยการที่ Hoffman และ Clemens มอบหมายให้กับผู้ขายที่ไม่มีอยู่จริง!

เป็นที่ชัดเจนว่าแต่ละค่าในคีย์นอกจะต้องแสดงเพียงครั้งเดียวและเพียงครั้งเดียวในคีย์หลัก

ในความเป็นจริง ค่าคีย์ต่างประเทศที่กำหนดสามารถอ้างอิงถึงค่าคีย์หลักเพียงค่าเดียวเท่านั้น โดยไม่สามารถย้อนกลับได้: กล่าวคือ คีย์นอกจำนวนเท่าใดก็ได้สามารถอ้างอิงถึงค่าคีย์หลักเพียงค่าเดียวได้ คุณสามารถดูสิ่งนี้ได้ในตารางทั่วไปของตัวอย่างของเรา ทั้ง Hoffman และ Clemens ได้รับมอบหมายให้ Peel ดังนั้นค่าคีย์ต่างประเทศทั้งคู่จึงเหมือนกับคีย์หลักเดียวกันซึ่งเป็นสิ่งที่ดี ค่าคีย์ต่างประเทศต้องอ้างอิงค่าคีย์หลักเพียงค่าเดียว แต่ค่าคีย์หลักสามารถอ้างอิงได้ด้วยค่าคีย์ต่างประเทศจำนวนเท่าใดก็ได้ ตามภาพประกอบ ค่าคีย์นอกจากตารางลูกค้าที่ตรงกับคีย์หลักในตารางผู้ขายจะแสดงในรูปที่ 19.1 เพื่อความสะดวก เราไม่ได้คำนึงถึงเพศที่ไม่เกี่ยวข้องกับตัวอย่างนี้

ข้อจำกัดที่สำคัญจากต่างประเทศ

SQL รักษาความสมบูรณ์ของการอ้างอิงด้วยข้อจำกัด FOREIGN KEY แม้ว่าข้อจำกัดของ FOREIGN KEY จะเป็นคุณลักษณะใหม่ใน SQL แต่ก็ยังไม่ได้ทำให้เป็นสากล นอกจากนี้ การใช้งานบางส่วนยังซับซ้อนกว่าการใช้งานอื่นๆ ฟังก์ชันนี้ควรจำกัดค่าที่คุณสามารถป้อนลงในฐานข้อมูลของคุณเพื่อบังคับคีย์ต่างประเทศและคีย์หลักให้สอดคล้องกับ Referential Integrity การดำเนินการประการหนึ่งของข้อจำกัดคีย์ต่างประเทศคือการละทิ้งค่าสำหรับฟิลด์ที่จำกัดเป็นคีย์ต่างประเทศที่ไม่ได้แสดงในคีย์หลัก ข้อจำกัดนี้ยังส่งผลต่อความสามารถของคุณในการเปลี่ยนแปลงหรือลบค่าคีย์หลัก (เราจะพูดถึงเรื่องนี้ในบทนี้ต่อไป)

ฟิลด์สามารถแสดงเป็นคีย์ต่างประเทศได้อย่างไร

คุณใช้ข้อจำกัด FOREIGN KEY ในคำสั่ง CREATE TABLE (หรือ ALTER TABLE) ที่ประกอบด้วยเขตข้อมูลที่คุณต้องการประกาศเป็น Foreign Key คุณให้คีย์หลักที่คุณจะอ้างอิงภายในข้อจำกัด FOREIGN KEY การวางข้อจำกัดนี้ในคำสั่งจะเหมือนกับข้อจำกัดอื่นๆ ที่กล่าวถึงในบทที่แล้ว รูปที่ 19.1: Foreign Key ของตารางลูกค้าพร้อมคีย์หลัก

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

คีย์ต่างประเทศเป็นข้อจำกัดของตาราง

ไวยากรณ์ข้อจำกัดตาราง FOREIGN KEY: FOREIGN KEY ข้อมูลอ้างอิง [ ] รายการคอลัมน์แรกคือรายการที่คั่นด้วยเครื่องหมายจุลภาคของคอลัมน์ตารางอย่างน้อยหนึ่งคอลัมน์ที่จะถูกสร้างขึ้นหรือแก้ไขโดยคำสั่งนี้ Pktable คือตารางที่มีคีย์หลัก อาจเป็นตารางที่สร้างหรือแก้ไขโดยคำสั่งปัจจุบัน รายการคอลัมน์ที่สองคือรายการคอลัมน์ที่จะประกอบเป็นคีย์หลัก รายการคอลัมน์ทั้งสองจะต้องเข้ากันได้ เช่น:

* ต้องมีจำนวนคอลัมน์เท่ากัน

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

มาสร้างตารางลูกค้าด้วยฟิลด์ snum ที่กำหนดให้เป็นคีย์ต่างประเทศที่อ้างอิงถึงตารางผู้ขาย: สร้างตารางลูกค้า (จำนวนเต็ม cnum ไม่ใช่คีย์หลักที่เป็นค่าว่าง cname char(10), ถ่านเมือง (10), จำนวนเต็ม snum, คีย์ต่างประเทศ (snum) การอ้างอิง พนักงานขาย (snum ); โปรดทราบว่าเมื่อใช้ ALTER TABLE แทน CREATE TABLE เพื่อให้ใช้ข้อ จำกัด FOREIGN KEY ค่าที่คุณระบุในคีย์ภายนอกและคีย์หลักจะต้องอยู่ในสถานะความสมบูรณ์ของการอ้างอิงมิฉะนั้นคำสั่งจะ ถูกปฏิเสธ แม้ว่า ALTER TABLE จะมีประโยชน์มาก - เพื่อความสะดวก คุณจะต้องกำหนดหลักการเชิงโครงสร้างก่อน เช่น ความสมบูรณ์ของการอ้างอิง ในระบบของคุณ ทุกครั้งที่เป็นไปได้ ทุกครั้ง

คีย์ต่างประเทศเป็นข้อจำกัดของคอลัมน์

ตัวเลือกในการจำกัดคอลัมน์ด้วยข้อจำกัด FOREIGN KEY เรียกอีกอย่างว่าข้อจำกัด REFERENCES เนื่องจากจริงๆ แล้วไม่มีคำว่า FOREIGN KEY แต่เพียงใช้คำว่า REFERENCES ตามด้วยคีย์หลัก เช่นนี้: CREATE TABLE Customers ( cnum จำนวนเต็มไม่เป็นโมฆะคีย์หลัก, ถ่าน cname (10), ถ่านเมือง (10), ตัวเลขจำนวนเต็ม snum ข้อมูลอ้างอิง พนักงานขาย (snum)); ข้อมูลข้างต้นกำหนดให้ Customers.snum เป็นคีย์ต่างประเทศซึ่งมีคีย์หลักคือ Salespeople.snum ซึ่งเทียบเท่ากับข้อจำกัดของตารางดังนี้: FOREIGN KEY (snum) REGERENCES พนักงานขาย (snum)

อย่าระบุรายการคอลัมน์คีย์หลัก

ด้วยการใช้ข้อจำกัด FOREIGN KEY บนตารางหรือคอลัมน์ คุณสามารถละเว้นรายการคอลัมน์ของคีย์หลักได้ หากคีย์หลักมีข้อจำกัดของคีย์หลัก โดยปกติแล้ว ในกรณีของคีย์ที่มีหลายฟิลด์ ลำดับของคอลัมน์ในคีย์ภายนอกและคีย์หลักจะต้องตรงกัน และไม่ว่าในกรณีใด หลักการของความเข้ากันได้ระหว่างคีย์ทั้งสองยังคงมีผลใช้อยู่ ตัวอย่างเช่น หากเราวางข้อจำกัดคีย์หลักไว้ในฟิลด์ snum ของตาราง Sales เราก็สามารถใช้เป็นคีย์นอกในตารางลูกค้าได้ (คล้ายกับตัวอย่างก่อนหน้า) ด้วยคำสั่งนี้: CREATE TABLE Customers (จำนวนเต็ม cnum NOT NULL คีย์หลัก, cname char(10) , city char(10), snum integer อ้างอิง พนักงานขาย); คุณลักษณะนี้สร้างขึ้นในภาษาเพื่อสนับสนุนให้คุณใช้คีย์หลักเป็นคีย์หลัก

ความสมบูรณ์ของการอ้างอิงจำกัดค่าของคีย์หลักอย่างไร

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

คีย์หลักเป็นคีย์ต่างประเทศที่ไม่ซ้ำใคร

การเชื่อมโยงคีย์ต่างประเทศของคุณกับคีย์หลักเท่านั้น ดังที่เราทำในตารางมาตรฐาน ถือเป็นกลยุทธ์ที่ดี เมื่อคุณใช้คีย์นอก คุณไม่เพียงแต่เชื่อมโยงคีย์เหล่านั้นกับคีย์หลักที่คีย์ดังกล่าวอ้างถึงเท่านั้น คุณเชื่อมโยงพวกมันกับแถวของตารางเฉพาะที่จะพบคีย์หลักนั้น คีย์หลักไม่ได้ให้ข้อมูลใด ๆ ที่ไม่มีอยู่ในคีย์ต่างประเทศ ตัวอย่างเช่น ความหมายของ sex snum ซึ่งเป็นคีย์นอกในตารางลูกค้าคือความสัมพันธ์ที่มีให้ ไม่ใช่ค่าของ sex snum ที่อ้างอิงถึง แต่กับข้อมูลอื่นๆ ในตาราง Sales เช่น ชื่อของ พนักงานขาย สถานที่ของพวกเขา และอื่นๆ คีย์นอกไม่ได้เป็นเพียงความสัมพันธ์ระหว่างค่าที่เหมือนกันสองค่าเท่านั้น นี่คือความสัมพันธ์โดยใช้สองค่านี้ ระหว่างสองแถวของตารางที่ระบุในแบบสอบถาม ช่อง snum นี้สามารถใช้เพื่อเชื่อมโยงข้อมูลใดๆ ในแถวจากตารางลูกค้ากับแถวที่อ้างอิงจากตารางผู้ขาย - ตัวอย่างเช่น เพื่อดูว่าพวกเขาอาศัยอยู่ในเมืองเดียวกันหรือไม่ ใครมีชื่อยาวกว่า ผู้ขายมีชื่อหรือไม่ ลูกค้ารายอื่นนอกเหนือจากลูกค้ารายนี้เป็นต้น เนื่องจากวัตถุประสงค์ของคีย์หลักคือเพื่อระบุความเป็นเอกลักษณ์ของแถว จึงเป็นทางเลือกที่สมเหตุสมผลมากกว่าและคลุมเครือน้อยกว่าสำหรับคีย์นอก สำหรับคีย์ภายนอกที่ใช้คีย์เฉพาะเป็นคีย์หลัก คุณต้องสร้างคีย์ต่างประเทศที่ใช้คีย์หลักของตารางเดียวกันเพื่อให้ได้ผลเหมือนกัน คีย์ภายนอกซึ่งไม่มีจุดประสงค์อื่นนอกจากการเชื่อมโยงแถว จะคล้ายกับคีย์หลักที่ใช้เพื่อระบุแถวเท่านั้น และเป็นวิธีที่ดีในการรักษาโครงสร้างของฐานข้อมูลของคุณให้ชัดเจนและเรียบง่าย และทำให้ซับซ้อนน้อยลง

ข้อจำกัดที่สำคัญจากต่างประเทศ

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

จะเกิดอะไรขึ้นหากคุณดำเนินการคำสั่งแก้ไข

กำหนดว่าคีย์ต่างประเทศทั้งหมดที่สร้างขึ้นในตารางตัวอย่างของเราได้รับการประกาศและบังคับใช้ด้วยข้อจำกัดของคีย์ต่างประเทศ ดังนี้: CREATE TABLE พนักงานขาย (จำนวนเต็ม snum NOT NULL PRIMARY KEY, sname char(10) NOT NULL, city char(10) , comm decimal ); สร้างตารางลูกค้า (จำนวนเต็ม cnum ไม่เป็น NULL คีย์หลัก, cname char (10) NOT NULL, ถ่านเมือง (10), จำนวนเต็มการให้คะแนน, จำนวนเต็ม snum, คีย์ต่างประเทศ (snum) พนักงานขายอ้างอิง, UNIQUE (cnum, snum) ; สร้างคำสั่งซื้อตาราง ( จำนวนเต็ม cnum ไม่เป็น NULL คีย์หลัก, amt ทศนิยม, วันที่ odate ไม่เป็น NULL, จำนวนเต็ม cnum ไม่เป็น NULL snum จำนวนเต็ม ไม่เป็น NULL FOREIGN KEY (cnum, snum) ลูกค้าอ้างอิง (cnum, snum);

รวมถึงคำอธิบายตาราง

มีคุณลักษณะหลายประการของคำจำกัดความดังกล่าวที่ต้องกล่าวถึง เหตุผลที่เราตัดสินใจสร้างพื้น cnum และ snum ในตารางคำสั่งซื้อโดยใช้คีย์ต่างประเทศเดียวคือเพื่อให้แน่ใจว่าสำหรับลูกค้าแต่ละรายที่อยู่ในคำสั่งซื้อ ผู้ขายที่เครดิตคำสั่งซื้อนี้จะเหมือนกับที่ระบุไว้ในตารางลูกค้า ในการสร้างคีย์นอก เราจะต้องวางข้อจำกัดของตาราง UNIQUE ไว้บนสองชั้นของตารางลูกค้า แม้ว่าตารางนั้นจะไม่จำเป็นก็ตาม ตราบใดที่ฟิลด์ cnum ในตารางนี้มีข้อจำกัดของคีย์หลัก ฟิลด์นั้นจะไม่ซ้ำกันในทุกกรณี และดังนั้นจึงเป็นไปไม่ได้ที่จะรวมฟิลด์ cnum อื่นเข้ากับฟิลด์อื่น การสร้างคีย์ภายนอกด้วยวิธีนี้จะรักษาความสมบูรณ์ของฐานข้อมูล แม้ว่าจะป้องกันไม่ให้คุณขัดจังหวะภายในโดยไม่ได้ตั้งใจและให้เครดิตผู้ขายใดๆ นอกเหนือจากที่ได้รับมอบหมายให้กับลูกค้ารายนั้นก็ตาม

จากมุมมองของการรักษาความสมบูรณ์ของฐานข้อมูล การขัดจังหวะภายใน (หรือข้อยกเว้น) เป็นสิ่งที่ไม่พึงประสงค์อย่างแน่นอน หากคุณอนุญาตและในเวลาเดียวกันต้องการรักษาความสมบูรณ์ของฐานข้อมูลของคุณ คุณสามารถประกาศเขตข้อมูล snum และ cnum ในตารางคำสั่งซื้อเป็นคีย์นอกที่เป็นอิสระของเขตข้อมูลเหล่านี้ในตารางผู้ขายและตารางลูกค้าตามลำดับ ที่จริงแล้ว การใช้ sex snum ในตาราง Order อย่างที่เราเคยทำนั้นไม่จำเป็น แม้ว่าจะมีประโยชน์หากทำเช่นนั้นเพื่อความหลากหลายก็ตาม ฟิลด์ cnum ที่เชื่อมโยงคำสั่งซื้อของลูกค้าแต่ละรายการในตารางลูกค้า ในตารางคำสั่งซื้อ และในตารางลูกค้าจะต้องถูกแชร์เสมอ เพื่อค้นหาฟิลด์ snum ที่ถูกต้องสำหรับคำสั่งซื้อนั้น (โดยไม่มีข้อยกเว้นใดๆ) ซึ่งหมายความว่า เรากำลังบันทึกข้อมูลชิ้นหนึ่ง - ลูกค้ารายใดที่ได้รับมอบหมายให้กับผู้จัดจำหน่ายรายใด - สองครั้ง และจะต้องทำงานเพิ่มเติมเพื่อให้แน่ใจว่าทั้งสองเวอร์ชันสอดคล้องกัน หากเราไม่มีข้อจำกัดของคีย์ต่างประเทศตามที่ระบุไว้ข้างต้น สถานการณ์นี้จะเป็นปัญหาอย่างยิ่ง เนื่องจากคำสั่งซื้อแต่ละรายการจะต้องได้รับการตรวจสอบด้วยตนเอง (พร้อมกับข้อความค้นหา) เพื่อให้แน่ใจว่าผู้ขายที่เกี่ยวข้องจะให้เครดิตการขายแต่ละรายการที่เกี่ยวข้อง การมีความซ้ำซ้อนของข้อมูลประเภทนี้ในฐานข้อมูลของคุณเรียกว่า การทำให้เป็นปกติ ซึ่งเป็นสิ่งที่ไม่พึงประสงค์ในฐานข้อมูลเชิงสัมพันธ์ในอุดมคติ แม้ว่าในทางปฏิบัติจะสามารถแก้ไขได้ก็ตาม การลดศีลธรรมอาจทำให้คิวรีบางตัวทำงานเร็วขึ้น เนื่องจากการสืบค้นในตารางเดียวจะเร็วกว่าการสืบค้นในการรวมเสมอ

ผลของข้อจำกัด

ข้อจำกัดดังกล่าวส่งผลต่อความสามารถและการไม่สามารถใช้คำสั่งการแก้ไข DML ของคุณอย่างไร สำหรับฟิลด์ที่กำหนดให้เป็นคีย์ภายนอก คำตอบนั้นค่อนข้างง่าย: ค่าใด ๆ ที่คุณใส่ลงในฟิลด์เหล่านั้นด้วยคำสั่ง INSERT หรือ UPDATE จะต้องมีอยู่ในคีย์พาเรนต์อยู่แล้ว คุณสามารถใส่ค่า NULL ในฟิลด์เหล่านี้ได้ แม้ว่าค่า NULL จะไม่ได้รับอนุญาตในคีย์พาเรนต์ก็ตาม หากมีข้อจำกัด NOT NULL คุณสามารถลบแถวที่มีคีย์นอกได้โดยไม่ต้องใช้คีย์หลักเลย

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

  • คุณสามารถจำกัดหรือห้ามการเปลี่ยนแปลง (ในรูปแบบ ANSI) โดยการระบุว่าการเปลี่ยนแปลงคีย์หลักนั้นถูกจำกัด
  • คุณสามารถทำการเปลี่ยนแปลงในคีย์หลักได้ และด้วยเหตุนี้จึงทำการเปลี่ยนแปลงในคีย์ต่างประเทศโดยอัตโนมัติ ซึ่งเรียกว่าการเปลี่ยนแปลงแบบเรียงซ้อน
  • คุณสามารถทำการเปลี่ยนแปลงคีย์หลัก และตั้งค่าคีย์ต่างประเทศเป็น NULL โดยอัตโนมัติ (สมมติว่าอนุญาตให้ใช้ NULLS ในคีย์ต่างประเทศได้) ซึ่งเรียกว่าการเปลี่ยนแปลงคีย์ต่างประเทศที่เป็นค่าว่าง

    แม้จะอยู่ในสามประเภทนี้ คุณอาจไม่ต้องการจัดการคำสั่งแก้ไขทั้งหมดในลักษณะนี้ แน่นอนว่า INSERT นั้นไม่เกี่ยวข้อง มันใส่ค่าใหม่ของคีย์หลักลงในตารางเพื่อไม่ให้สามารถเรียกค่าเหล่านั้นได้ในขณะนี้ อย่างไรก็ตาม คุณอาจต้องการอนุญาตให้แก้ไขต่อเนื่องกันโดยไม่มีการลบ และในทางกลับกัน สถานการณ์ที่ดีกว่าอาจเป็นสถานการณ์ที่ให้คุณกำหนดหมวดหมู่ใดๆ ในสามหมวดหมู่ โดยไม่ขึ้นกับคำสั่ง UPDATE และ DELETE ดังนั้นเราจะอ้างอิงถึงเอฟเฟกต์การอัพเดตและเอฟเฟกต์การลบ ซึ่งจะกำหนดว่าจะเกิดอะไรขึ้นหากคุณออกคำสั่ง UPDATE หรือ DELETE บนคีย์หลัก เอฟเฟกต์เหล่านี้ที่เราพูดถึงเรียกว่า: การเปลี่ยนแปลงที่จำกัด การเปลี่ยนแปลง CASCADES และการเปลี่ยนแปลง NULL ความสามารถที่แท้จริงของระบบของคุณควรอยู่ภายในมาตรฐาน ANSI ที่เข้มงวด - เอฟเฟกต์การแก้ไขและการลบจะถูกจำกัดโดยอัตโนมัติ - สำหรับสถานการณ์ในอุดมคติที่อธิบายไว้ข้างต้น เพื่อให้เห็นภาพ เราจะแสดงตัวอย่างเล็กๆ น้อยๆ ของสิ่งที่คุณสามารถทำได้ด้วยเอฟเฟ็กต์การแก้ไขและการลบอย่างเต็มรูปแบบ แน่นอนว่าเอฟเฟกต์การแก้ไขและการลบซึ่งเป็นวิธีการที่ไม่ได้มาตรฐานนั้นขาดไวยากรณ์สถานะมาตรฐาน ไวยากรณ์ที่เราใช้ที่นี่เขียนได้ง่ายและจะทำหน้าที่อธิบายฟังก์ชันของเอฟเฟกต์เหล่านี้เพิ่มเติม

    เพื่อความสมบูรณ์ของการทดสอบ สมมติว่าคุณมีเหตุผลในการเปลี่ยนฟิลด์ snum ของตาราง Vendors ในกรณีที่ตาราง Vendors ของเราเปลี่ยนพาร์ติชัน (โดยปกติแล้วการเปลี่ยนคีย์หลักไม่ใช่สิ่งที่เราแนะนำให้ทำในทางปฏิบัติ มันเป็นเพียงอีกเหตุผลหนึ่งสำหรับคีย์หลักที่มีอยู่ซึ่งไม่รู้ว่าจะทำอย่างไรนอกจากทำหน้าที่เป็นคีย์หลัก: ไม่ควรเปลี่ยนแปลง) เมื่อคุณเปลี่ยนผู้ขาย คุณต้องการให้ลูกค้าทั้งหมดได้รับการบันทึก อย่างไรก็ตาม หากพนักงานขายรายนี้ลาออกจากบริษัทหรือบริษัทของเขา คุณอาจไม่ต้องการลบลูกค้าของเขาออกในขณะที่ลบเขาออกจากฐานข้อมูล คุณจะต้องแน่ใจว่าลูกค้าถูกกำหนดให้กับบุคคลอื่นแทน เมื่อต้องการทำเช่นนี้ คุณต้องระบุ UPDATE ด้วยเอฟเฟกต์ Cascading และ DELETE ด้วยเอฟเฟกต์แบบจำกัด สร้างตารางลูกค้า (จำนวนเต็ม cnum ไม่ใช่คีย์หลักที่เป็นโมฆะ, ถ่าน cname (10) ไม่เป็นโมฆะ, ถ่านเมือง (10), จำนวนเต็มการให้คะแนน, จำนวนเต็ม snum อ้างอิงพนักงานขาย, อัปเดตของพนักงานขาย CASCADES, ลบพนักงานขายที่ถูก จำกัด ); ถ้าคุณพยายามลบ Peel ออกจากตาราง Vendors คำสั่งจะไม่ถูกต้องจนกว่าคุณจะเปลี่ยนค่า snum เพศของลูกค้า Hoffman และ Clemens สำหรับผู้จัดจำหน่ายรายอื่นที่ได้รับมอบหมาย ในทางกลับกัน คุณสามารถเปลี่ยนค่าเพศของ Peel เป็น 1009 ได้ และ Hoffman และ Clemens ก็จะถูกเปลี่ยนโดยอัตโนมัติเช่นกัน

    ผลกระทบที่สามคือการเปลี่ยนแปลงที่ว่างเปล่า (NULL) มันเกิดขึ้นเมื่อผู้ขายออกจากบริษัท คำสั่งซื้อปัจจุบันของพวกเขาจะไม่ถูกโอนไปยังผู้ขายรายอื่น ในทางกลับกัน คุณต้องการยกเลิกคำสั่งซื้อทั้งหมดโดยอัตโนมัติสำหรับลูกค้าที่คุณลบบัญชี โดยการเปลี่ยนหมายเลขผู้ขายหรือลูกค้า คุณก็สามารถโอนให้เขาได้ ตัวอย่างด้านล่างแสดงวิธีที่คุณสามารถสร้างตารางคำสั่งซื้อโดยใช้เอฟเฟกต์เหล่านี้ สร้างคำสั่งซื้อของตาราง (จำนวนเต็ม onum ไม่เป็น NULL คีย์หลัก, amt ทศนิยม, วันที่ odate ไม่ใช่ NULL cnum จำนวนเต็มไม่ใช่ NULL อ้างอิง ลูกค้า snum จำนวนเต็ม อ้างอิงพนักงานขาย, อัปเดตของลูกค้า CASCADES, ลบลูกค้า CASCADES, อัปเดตของพนักงานขาย CASCADES, ลบพนักงานขาย NULLS); แน่นอน ในคำสั่ง DELETE ที่มีผลกระทบจากการเปลี่ยนแปลงที่ว่างเปล่าบนตาราง Vendors ข้อจำกัด NOT NULL จะต้องถูกลบออกจากฟิลด์ snum

    คีย์ต่างประเทศที่อ้างอิงกลับไปยังตารางหัวเรื่องของพวกเขา

    ตามที่กล่าวไว้ก่อนหน้านี้ ข้อจำกัดของ FOREIGN KEY สามารถแสดงตารางส่วนตัวนี้เป็นตารางคีย์หลักได้ ฟีเจอร์นี้ห่างไกลจากความเรียบง่าย แต่มีประโยชน์ สมมติว่าเรามีตารางพนักงานพร้อมฟิลด์ผู้จัดการ ฟิลด์นี้ประกอบด้วยหมายเลขของพนักงานแต่ละคน ซึ่งบางคนก็เป็นผู้ดูแลระบบด้วย แต่เนื่องจากผู้ดูแลระบบทุกคนยังคงเป็นพนักงานในเวลาเดียวกัน เขาจึงจะถูกนำเสนอในตารางนี้ด้วยเช่นกัน เรามาสร้างตารางโดยประกาศหมายเลขพนักงาน (คอลัมน์ชื่อ empno) เป็นคีย์หลัก และผู้ดูแลระบบในฐานะคีย์ต่างประเทศจะอ้างอิงหมายเลขนั้น: CREATE TABLE Employees (จำนวนเต็ม empno NOT NULL PRIMARY KEY, ชื่อ char(10) ไม่เป็นโมฆะ UNIOUE ผู้จัดการจำนวนเต็มอ้างอิงพนักงาน); (เนื่องจากคีย์ต่างประเทศเป็นคีย์หลักที่อ้างอิงของตาราง รายการคอลัมน์จึงสามารถยกเว้นได้) มีเนื้อหาของตารางนี้: EMPNO NAME MANAGER _____ ________ _______ 1003 Terrence 2007 2007 Atali NULL 1688 McKenna 1003 2002 Collier 2007 ในขณะที่คุณ สามารถมองเห็นได้ แต่ละสิ่งเหล่านี้ (แต่ไม่ใช่ Atali) หมายถึงพนักงานคนอื่นในตารางในฐานะผู้ดูแลระบบของเขา Atali ซึ่งมีตัวเลขสูงสุดในตาราง จะต้องตั้งค่าเป็น NULL นี่เป็นอีกหลักการหนึ่งของ Referential Integrity คีย์นอกที่อ้างอิงกลับไปยังตารางส่วนตัวต้องยอมให้ค่า = NULL หากไม่เป็นเช่นนั้น คุณจะแทรกแถวแรกอย่างไร แม้ว่าแถวแรกนี้จะอ้างอิงถึงตัวเอง ค่าของคีย์หลักจะต้องถูกตั้งค่าไว้แล้วเมื่อป้อนค่าคีย์นอก หลักการนี้จะเป็นจริงแม้ว่าคีย์ต่างประเทศจะอ้างอิงกลับไปยังตารางส่วนตัวโดยตรง แต่ผ่านการอ้างอิงไปยังตารางอื่น ซึ่งจะอ้างอิงกลับไปยังตารางคีย์นอก ตัวอย่างเช่น สมมติว่าตารางการขายของเรามีช่องเพิ่มเติมที่อ้างอิงถึงตารางลูกค้า เพื่อให้แต่ละตารางอ้างอิงถึงอีกตารางหนึ่ง ดังที่แสดงในคำสั่ง CREATE TABLE ต่อไปนี้: CREATE TABLE Salespeople (snum integer NOT NULL PRIMARY KEY, sname char(10) ไม่เป็นโมฆะ, ถ่านเมือง (10), comm declmal, ลูกค้าอ้างอิงจำนวนเต็ม cnum); สร้างตารางลูกค้า (จำนวนเต็ม cnum ไม่ใช่คีย์หลักที่เป็นโมฆะ, ถ่าน cname (10) ไม่เป็นโมฆะ, ถ่านเมือง (10), จำนวนเต็มการจัดอันดับ, จำนวนเต็ม snum พนักงานขายอ้างอิง); สิ่งนี้เรียกว่าการอ้างอิงโยง SQL สนับสนุนสิ่งนี้ในทางทฤษฎี แต่ในทางปฏิบัติอาจเป็นปัญหาได้ ไม่ว่าตารางใดของทั้งสองจะถูกสร้างขึ้นก่อนจะเป็นตารางอ้างอิงที่ยังไม่มีสำหรับอีกตารางหนึ่ง เพื่อประโยชน์ของการอ้างอิงโยง SQL อนุญาตสิ่งนี้จริง ๆ แต่ไม่มีตารางใดที่จะสามารถใช้งานได้ในขณะที่ทั้งสองอยู่ในกระบวนการสร้าง ในทางกลับกัน ถ้าทั้งสองตารางถูกสร้างขึ้นโดยผู้ใช้ที่แตกต่างกัน ปัญหาก็จะยิ่งยากขึ้น การอ้างอิงโยงอาจเป็นเครื่องมือที่มีประโยชน์ แต่ก็ไม่ได้ปราศจากความคลุมเครือและอันตราย ตัวอย่างก่อนหน้านี้ ไม่สามารถใช้งานได้ทั้งหมด เนื่องจากจำกัดผู้ขายไว้เฉพาะลูกค้ารายเดียว และไม่จำเป็นต้องใช้ตัวอ้างอิงโยงเพื่อให้บรรลุเป้าหมายนี้ เราขอแนะนำให้คุณใช้ความระมัดระวังและวิเคราะห์วิธีที่โปรแกรมของคุณจัดการผลกระทบของการแก้ไขและการลบ รวมถึงกระบวนการของสิทธิพิเศษและการประมวลผลแบบสอบถามเชิงโต้ตอบ ก่อนที่คุณจะสร้างระบบความสมบูรณ์ของการอ้างอิงโยง (สิทธิพิเศษและการประมวลผลคำขอเชิงโต้ตอบจะกล่าวถึงตามลำดับในบทที่ 22 และ 1)

    สรุป

    ขณะนี้คุณสามารถควบคุมความสมบูรณ์ของการอ้างอิงได้ค่อนข้างดีแล้ว แนวคิดพื้นฐานคือค่าคีย์ต่างประเทศทั้งหมดอ้างอิงถึงแถวคีย์หลักที่ระบุ ซึ่งหมายความว่าค่าคีย์ต่างประเทศแต่ละค่าจะต้องแสดงเพียงครั้งเดียวและเพียงครั้งเดียวในคีย์หลัก เมื่อใดก็ตามที่วางค่าลงในคีย์นอก คีย์หลักจะถูกตรวจสอบเพื่อให้แน่ใจว่าค่านั้นถูกแสดง มิฉะนั้นคำสั่งจะถูกปฏิเสธ คีย์หลักจะต้องมีข้อจำกัดของคีย์หลักหรือ UNIQUE เพื่อให้แน่ใจว่าค่าจะไม่ถูกแสดงมากกว่าหนึ่งครั้ง ความพยายามที่จะเปลี่ยนค่าคีย์หลักที่แสดงอยู่ในคีย์ต่างประเทศในปัจจุบันจะถูกปฏิเสธโดยสิ้นเชิง อย่างไรก็ตาม ระบบของคุณอาจเสนอทางเลือกให้คุณรับค่าของคีย์นอกที่ตั้งค่าเป็น NULL หรือรับค่าใหม่ของคีย์หลัก และระบุว่าคีย์ใดสามารถรับได้โดยอิสระสำหรับคำสั่ง UPDATE และ DELETE นี่เป็นการสรุปการสนทนาของเราเกี่ยวกับคำสั่ง CREATE TABLE ต่อไปเราจะแนะนำคำสั่งประเภทอื่นให้คุณ - CREATE ในบทที่ 20 คุณจะได้เรียนรู้วิธีแสดงวัตถุข้อมูลที่มีลักษณะและทำหน้าที่เหมือนตาราง แต่จริงๆ แล้วเป็นผลลัพธ์ของการสืบค้น ฟังก์ชันข้อจำกัดบางอย่างสามารถดำเนินการตามมุมมอง ดังนั้นคุณจะสามารถประเมินความต้องการข้อจำกัดของคุณได้ดีขึ้น หลังจากที่คุณอ่านสามบทถัดไป

    การทำงานกับ SQL

    1. สร้างตารางชื่อ Cityorders ควรมีฟิลด์ onum, amt และ snum เดียวกันกับตารางคำสั่งซื้อ และฟิลด์ cnum และเมืองเดียวกันกับตารางลูกค้า เพื่อให้คำสั่งซื้อของลูกค้าแต่ละรายถูกป้อนลงในตารางนี้พร้อมกับเมือง ฟิลด์ onum จะเป็นคีย์หลักของ Cityorders ทุกชั้นใน Cityorders ต้องมีข้อจำกัดเมื่อเปรียบเทียบกับตารางลูกค้าและคำสั่งซื้อ อาจเป็นไปได้ว่าคีย์หลักในตารางเหล่านี้มีข้อจำกัดที่เหมาะสมอยู่แล้ว

    2. มาทำให้ปัญหาซับซ้อนขึ้น กำหนดตารางคำสั่งซื้อใหม่ดังนี้: เพิ่มคอลัมน์ใหม่ที่เรียกว่า prev ซึ่งจะถูกระบุสำหรับคำสั่งซื้อแต่ละรายการ ฟิลด์ onum ของคำสั่งซื้อก่อนหน้าสำหรับลูกค้าปัจจุบันนั้น ทำสิ่งนี้โดยใช้คีย์ต่างประเทศที่อ้างอิงถึงตาราง Order เอง คีย์ต่างประเทศยังต้องอ้างอิงถึงฟิลด์ cnum ของลูกค้า โดยให้ความสัมพันธ์ที่กำหนดไว้เฉพาะระหว่างคำสั่งซื้อปัจจุบันและคำสั่งซื้อที่อ้างอิง

    (ดูคำตอบในภาคผนวก A)

  • มันใช้กับ: SQL Server (ตั้งแต่ปี 2016)Azure SQL DatabaseAzure SQL Data WarehouseParallel Data Warehouse

    คีย์หลักและคีย์ภายนอกเป็นข้อจำกัดสองประเภทที่สามารถใช้เพื่อรับประกันความสมบูรณ์ของข้อมูลในตาราง SQL Server สิ่งเหล่านี้เป็นวัตถุฐานข้อมูลที่สำคัญ

    หัวข้อนี้ครอบคลุมอยู่ในส่วนต่อไปนี้

    ข้อจำกัดคีย์หลัก

    ข้อจำกัดคีย์ต่างประเทศ

    งานที่เกี่ยวข้อง

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

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

    ดังแสดงในรูปต่อไปนี้ คอลัมน์ รหัสผลิตภัณฑ์และ รหัสผู้ขายในตาราง การจัดซื้อผลิตภัณฑ์ผู้ขายสร้างข้อจำกัดคีย์หลักแบบผสมสำหรับตารางที่กำหนด เพื่อให้แน่ใจว่าแต่ละแถวในตาราง ผู้จำหน่ายผลิตภัณฑ์มีความหมายผสมผสานกันเป็นเอกลักษณ์ รหัสผลิตภัณฑ์และ รหัสผู้ขาย. เพื่อป้องกันไม่ให้มีการแทรกแถวที่ซ้ำกัน

      ตารางสามารถมีข้อจำกัดคีย์หลักได้เพียงรายการเดียวเท่านั้น

      คีย์หลักไม่สามารถมีได้มากกว่า 16 คอลัมน์ และความยาวคีย์ทั้งหมดต้องไม่เกิน 900 ไบต์

      ดัชนีที่สร้างขึ้นโดยข้อจำกัดคีย์หลักไม่สามารถทำให้จำนวนดัชนีในตารางเกินขีดจำกัดของดัชนีที่ไม่ใช่คลัสเตอร์ 999 รายการและดัชนีคลัสเตอร์ 1 รายการ

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

      คอลัมน์ทั้งหมดที่มีข้อจำกัดของคีย์หลักจะต้องกำหนดให้ไม่เป็นค่าว่าง หากไม่ได้ระบุความเป็นโมฆะ คอลัมน์ทั้งหมดที่มีข้อจำกัดของคีย์หลักจะถูกตั้งค่าเป็นค่าไม่เป็นค่าว่าง

      หากมีการกำหนดคีย์หลักในคอลัมน์ของประเภทข้อมูลที่ผู้ใช้กำหนดของ CLR การใช้งานประเภทนั้นจะต้องสนับสนุนการเรียงลำดับแบบไบนารี

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

    ตัวอย่างเช่น ตาราง Sales.SalesOrderHeaderเชื่อมโยงกับตาราง พนักงานขาย.พนักงานขายการใช้คีย์ต่างประเทศเนื่องจากมีความสัมพันธ์เชิงตรรกะระหว่างใบสั่งขายและผู้จัดการฝ่ายขาย คอลัมน์ รหัสพนักงานขายในตาราง Sales.SalesOrderHeaderตรงกับคอลัมน์คีย์หลักในตาราง พนักงานขาย. คอลัมน์ รหัสพนักงานขายในตาราง Sales.SalesOrderHeaderเป็นคีย์นอกของตาราง พนักงานขาย. โดยการสร้างความสัมพันธ์นี้โดยใช้คีย์ต่างประเทศ ค่าของ รหัสพนักงานขายไม่สามารถแทรกลงในตารางได้ SalesOrderHeaderหากไม่มีอยู่ในตารางในปัจจุบัน พนักงานขาย.

    จำนวนสูงสุดของตารางและคอลัมน์ที่ตารางสามารถอ้างอิงเป็นคีย์ภายนอก (การอ้างอิงขาออก) คือ 253 SQL Server 2016 จะเพิ่มขีดจำกัดในจำนวนของตารางและคอลัมน์อื่นที่สามารถอ้างอิงคอลัมน์ในตารางเดียวกัน (การอ้างอิงขาเข้า) จาก 253 สูงสุด 10,000 (ต้องมีระดับความเข้ากันได้อย่างน้อย 130) การขยายขึ้นอยู่กับข้อจำกัดต่อไปนี้:

      การอ้างอิงคีย์ต่างประเทศเกิน 253 รายการได้รับการสนับสนุนสำหรับการดำเนินการ DML DELETE เท่านั้น ไม่รองรับการดำเนินการ UPDATE และ MERGE

      การอ้างอิงคีย์ต่างประเทศเกิน 253 รายการในขณะนี้ไม่พร้อมใช้งานสำหรับดัชนี columnstore ตารางที่ปรับให้เหมาะสมหน่วยความจำ ฐานข้อมูลแบบขยาย หรือตารางที่แบ่งพาร์ติชันคีย์ต่างประเทศ

    ดัชนีในข้อจำกัดคีย์ต่างประเทศ

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

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

      ข้อจำกัดของคีย์ภายนอกจะตรวจสอบการเปลี่ยนแปลงข้อจำกัดของคีย์หลักในตารางที่เกี่ยวข้อง

    ความสมบูรณ์ของการอ้างอิง

    วัตถุประสงค์หลักของข้อจำกัดของคีย์ภายนอกคือเพื่อควบคุมข้อมูลที่สามารถจัดเก็บไว้ในตารางคีย์ภายนอกได้ แต่ข้อจำกัดยังควบคุมการเปลี่ยนแปลงข้อมูลในตารางคีย์หลักด้วย ตัวอย่างเช่น หากคุณลบแถวสำหรับผู้จัดการฝ่ายขายออกจากตาราง พนักงานขาย.พนักงานขายซึ่งมี ID ที่ใช้ในใบสั่งขายในตาราง Sales.SalesOrderHeaderความสมบูรณ์ในการอ้างอิงของทั้งสองตารางจะถูกละเมิด ใบสั่งขายของผู้จัดการระยะไกลในตาราง SalesOrderHeaderจะใช้งานไม่ได้หากไม่มีการเชื่อมต่อกับข้อมูลในตาราง พนักงานขาย.

    ข้อจำกัดของคีย์ที่ต่างประเทศป้องกันไม่ให้สถานการณ์นี้เกิดขึ้น ข้อจำกัดบังคับใช้ Referential Integrity ในลักษณะต่อไปนี้: จะป้องกันการเปลี่ยนแปลงข้อมูลในตารางคีย์หลัก หากการเปลี่ยนแปลงดังกล่าวจะทำให้การอ้างอิงในตาราง Foreign Key ไม่ถูกต้อง หากคุณพยายามลบแถวในตารางคีย์หลักหรือเปลี่ยนค่าของคีย์นั้น หากคุณพบว่าค่าคีย์หลักที่ถูกลบหรือเปลี่ยนแปลงนั้นมีค่าที่สอดคล้องกันในข้อจำกัดคีย์ภายนอกในตารางอื่น การดำเนินการจะล้มเหลว หากต้องการแก้ไขหรือลบแถวที่มีข้อจำกัดของ Foreign Key ได้สำเร็จ คุณต้องลบข้อมูล Foreign Key ในตาราง Foreign Key ก่อน หรือเปลี่ยนข้อมูลในตาราง Foreign Key ที่เกี่ยวข้องกับ Foreign Key กับข้อมูลในคีย์หลักอื่น

    ความสมบูรณ์ของการอ้างอิงแบบเรียงซ้อน

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

    ไม่มีการตอบสนอง
    โปรแกรมฐานข้อมูลสร้างข้อผิดพลาด จากนั้นย้อนกลับการดำเนินการลบหรืออัปเดตบนแถวในตารางหลัก

    น้ำตก
    แถวที่เกี่ยวข้องจะได้รับการอัปเดตหรือลบออกจากตารางอ้างอิง หากแถวนั้นได้รับการอัปเดตหรือลบออกจากตารางหลัก ไม่สามารถระบุค่า CASCADE ได้หากคอลัมน์เป็นประเภท การประทับเวลาเป็นส่วนหนึ่งของคีย์ต่างประเทศหรือคีย์อ้างอิง ไม่สามารถระบุการดำเนินการ ON DELETE CASCADE บนตารางที่มีทริกเกอร์ INSTEAD OF DELETE กำหนดไว้ ไม่สามารถระบุคำสั่งย่อย ON UPDATE CASCADE บนตารางที่มีทริกเกอร์ INSTEAD OF UPDATE กำหนดไว้

    ตั้งค่าเป็นโมฆะ
    ค่าทั้งหมดที่ประกอบเป็นคีย์นอกจะถูกตั้งค่าเป็น NULL เมื่อมีการอัพเดตหรือลบแถวที่เกี่ยวข้องในตารางหลัก เพื่อให้เป็นไปตามข้อจำกัดนี้ คอลัมน์คีย์นอกต้องเป็นค่าว่าง ไม่สามารถตั้งค่าบนตารางที่มีทริกเกอร์ INSTEAD OF UPDATE กำหนดไว้

    ตั้งค่าเริ่มต้น
    ค่าทั้งหมดที่ประกอบเป็นคีย์นอกจะถูกตั้งค่าเป็นค่าเริ่มต้นเมื่อมีการลบหรืออัปเดตแถวที่เกี่ยวข้องในตารางหลัก เพื่อให้เป็นไปตามข้อจำกัดนี้ คอลัมน์คีย์นอกทั้งหมดต้องมีคำจำกัดความเริ่มต้น หากคอลัมน์มีค่าเป็นโมฆะและไม่ได้กำหนดค่าเริ่มต้นไว้อย่างชัดเจน ค่าเริ่มต้นของคอลัมน์จะกลายเป็น NULL ไม่สามารถตั้งค่าบนตารางที่มีทริกเกอร์ INSTEAD OF UPDATE กำหนดไว้

    คำสำคัญ CASCADE, SET NULL, SET DEFAULT และ NO ACTION สามารถรวมกันในตารางที่มีความสัมพันธ์ในการอ้างอิงร่วมกัน หากโปรแกรมฐานข้อมูลพบคำสำคัญ NO ACTION โปรแกรมจะหยุดและย้อนกลับการดำเนินการ CASCADE, SET NULL และ SET DEFAULT ที่เกี่ยวข้อง หากคำสั่ง DELETE มีคีย์เวิร์ด CASCADE, SET NULL, SET DEFAULT และ NO ACTION รวมกัน การดำเนินการ CASCADE, SET NULL และ SET DEFAULT ทั้งหมดจะดำเนินการก่อนที่โปรแกรมฐานข้อมูลจะค้นหาการดำเนินการ NO ACTION

    ทริกเกอร์และการดำเนินการอ้างอิงแบบเรียงซ้อน

    การดำเนินการอ้างอิงแบบเรียงซ้อนจะทริกเกอร์ AFTER UPDATE หรือ AFTER DELETE ดังต่อไปนี้:

      การดำเนินการอ้างอิงแบบเรียงซ้อนทั้งหมดที่เกิดขึ้นโดยตรงจากคำสั่ง DELETE หรือ UPDATE ดั้งเดิมจะถูกดำเนินการก่อน

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

      หากลำดับการดำเนินการแบบเรียงซ้อนเกิดขึ้นจากตารางที่เป็นเป้าหมายทันทีของการดำเนินการ DELETE หรือ UPDATE ลำดับที่ทริกเกอร์การทำงานของลำดับการดำเนินการจะไม่ถูกกำหนด อย่างไรก็ตาม ลำดับการกระทำหนึ่งจะยิงทริกเกอร์ทั้งหมดก่อนที่ทริกเกอร์ถัดไปจะเริ่มทำงานเสมอ

      ทริกเกอร์ AFTER บนตารางที่เป็นเป้าหมายทันทีของการดำเนินการ DELETE หรือ UPDATE จะทำงานไม่ว่าแถวจะมีการเปลี่ยนแปลงหรือไม่ก็ตาม ในกรณีนี้ ไม่มีตารางอื่นใดได้รับผลกระทบจากการเรียงซ้อน

      หากทริกเกอร์ตัวใดตัวหนึ่งก่อนหน้านี้ดำเนินการ DELETE หรือ UPDATE บนตารางอื่น การดำเนินการเหล่านั้นสามารถทริกเกอร์ลำดับของการดำเนินการแบบเรียงซ้อนของตัวเองได้ ลำดับการดำเนินการรองเหล่านี้ได้รับการประมวลผลสำหรับการดำเนินการ DELETE หรือ UPDATE แต่ละครั้ง หลังจากที่ทริกเกอร์ลำดับการดำเนินการหลักทั้งหมดเสร็จสิ้นแล้ว กระบวนการนี้สามารถทำซ้ำแบบวนซ้ำสำหรับการดำเนินการ DELETE หรือ UPDATE ในภายหลัง

      การดำเนินการ CREATE, ALTER, DELETE หรือการดำเนินการ DDL อื่นๆ ภายในทริกเกอร์อาจทำให้ทริกเกอร์ DDL เริ่มทำงานได้ สิ่งนี้สามารถนำไปสู่การดำเนินการ DELETE หรือ UPDATE เพิ่มเติม ซึ่งจะเริ่มลำดับเพิ่มเติมของการดำเนินการแบบเรียงซ้อนและเรียกใช้ทริกเกอร์

      หากมีข้อผิดพลาดเกิดขึ้นในลำดับใดโดยเฉพาะของการดำเนินการอ้างอิงแบบเรียงซ้อน ทริกเกอร์ AFTER จะไม่เริ่มทำงานในลำดับนั้น และการดำเนินการ DELETE หรือ UPDATE ที่สร้างโดยลำดับนั้นจะถูกย้อนกลับ

      ตารางที่มีทริกเกอร์ INSTEAD OF กำหนดไว้สามารถมีส่วนคำสั่ง REFERENCES ที่ระบุการดำเนินการแบบเรียงซ้อนเฉพาะได้ อย่างไรก็ตาม ทริกเกอร์ AFTER บนตารางเป้าหมายของการดำเนินการแบบเรียงซ้อนสามารถออกคำสั่ง INSERT, UPDATE หรือ DELETE บนตารางหรือมุมมองอื่น ซึ่งจะเริ่มการทำงานของทริกเกอร์ INSTEAD OF บนวัตถุนั้น

    ตารางต่อไปนี้แสดงรายการงานทั่วไปที่เกี่ยวข้องกับข้อจำกัดของคีย์หลักและคีย์นอก

    Foreign Key คือคีย์ที่ใช้ในการรวมสองตาราง บางครั้งเรียกว่าคีย์อ้างอิง

    Foreign Key คือคอลัมน์หรือการรวมกันของคอลัมน์ที่มีค่าตรงกับคีย์หลักในตารางอื่น

    ความสัมพันธ์ระหว่าง 2 ตารางสอดคล้องกับคีย์หลักในตารางใดตารางหนึ่งกับคีย์นอกในตารางที่สอง

    หากตารางมีคีย์หลักที่กำหนดไว้ในฟิลด์ใดๆ คุณจะไม่สามารถมีสองเรคคอร์ดที่มีค่าเหมือนกันสำหรับฟิลด์นั้นได้

    ตัวอย่าง

    ลองดูที่โครงสร้างของสองตารางต่อไปนี้

    โต๊ะลูกค้า

    สร้างลูกค้าตาราง (ID INT ไม่ใช่ NULL, ชื่อ VARCHAR (20) ไม่ใช่ NULL, อายุ INT ไม่ใช่ NULL, ที่อยู่ CHAR (25) , เงินเดือนทศนิยม (18, 2), คีย์หลัก (ID));

    ตารางคำสั่งซื้อ

    สร้างคำสั่งซื้อตาราง (ID INT ไม่ใช่ NULL, DATE DATETIME, INT อ้างอิงลูกค้า (ID), จำนวนเงินสองเท่า, คีย์หลัก (ID));

    หากตาราง ORDERS ถูกสร้างขึ้นแล้ว และยังไม่ได้ตั้งค่าคีย์ Foreign ไวยากรณ์จะถูกใช้เพื่อตั้งค่าคีย์ Foreign โดยการแก้ไขตาราง

    แก้ไขคำสั่งซื้อของตารางเพิ่มรหัสต่างประเทศ (Customer_ID) ลูกค้าอ้างอิง (ID);

    การลบข้อจำกัดคีย์ต่างประเทศ

    หากต้องการลบข้อจำกัดของคีย์ภายนอก ให้ใช้ไวยากรณ์ SQL ต่อไปนี้

    แก้ไขคำสั่งซื้อของตารางวางคีย์ต่างประเทศ

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

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

    เรียกว่าแอตทริบิวต์ที่มีค่าระบุสิ่งอันดับไม่ซ้ำกัน สำคัญ (หรือเพียงแค่ สำคัญ). สิ่งสำคัญคือแอตทริบิวต์ Personnel Number เนื่องจากค่าของแอตทริบิวต์จะไม่ซ้ำกันสำหรับพนักงานแต่ละคนในองค์กร หากระบุสิ่งอันดับโดยการต่อค่าของแอตทริบิวต์หลาย ๆ เข้าด้วยกันเท่านั้น แสดงว่าความสัมพันธ์นั้นมีคีย์ผสม

    คีย์หลัก- ในโมเดลข้อมูลเชิงสัมพันธ์ หนึ่งในคีย์ที่เป็นไปได้ของความสัมพันธ์ ที่เลือกเป็นคีย์หลัก (หรือคีย์ดีฟอลต์)

    ความสัมพันธ์สามารถมีหลายคีย์ได้ หนึ่งในคีย์จะถูกประกาศเสมอ หลักไม่สามารถอัปเดตค่าได้ คีย์ความสัมพันธ์อื่นๆ ทั้งหมดจะถูกเรียก กุญแจที่เป็นไปได้.

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

    ถ้า คีย์หลักประกอบด้วยคุณลักษณะเดียวเรียกว่า ด้วยปุ่มง่ายๆ.

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



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

    คุณลักษณะที่เป็นสำเนาของคีย์ของความสัมพันธ์อื่นเรียกว่า กุญแจต่างประเทศ.

    ตัวอย่างเช่น ความสัมพันธ์ระหว่างความสัมพันธ์ของ DEPARTMENT และ EMPLOYEE ถูกสร้างขึ้นโดยการคัดลอกคีย์หลัก "แผนก_หมายเลข" จากความสัมพันธ์แรกสู่ความสัมพันธ์ครั้งที่สอง ดังนั้นเพื่อให้ได้รายชื่อพนักงานของแผนกที่กำหนด จำเป็นต้องมี: 1) จากตาราง DEPARTMENT ให้ตั้งค่าแอตทริบิวต์ "แผนก_หมายเลข" ซึ่งสอดคล้องกับ “Department_Name” นี้ 2) เลือกบันทึกทั้งหมดจากตาราง EMPLOYEE ค่าแอตทริบิวต์ "แผนก_หมายเลข"ซึ่งเท่ากับที่ได้มาจากขั้นตอนที่แล้ว หากต้องการทราบว่าพนักงานทำงานในแผนกใด คุณต้องดำเนินการย้อนกลับ: 1) กำหนด "แผนก_หมายเลข"จากตารางพนักงาน 2) เมื่อใช้ค่าที่ได้รับเราจะค้นหารายการในตาราง DEPARTMENT


    18. การทำให้เป็นมาตรฐานในฐานข้อมูลเชิงสัมพันธ์ แนวคิดของรูปแบบปกติในการออกแบบฐานข้อมูล

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

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



    ตามกฎแล้วการกำจัดความซ้ำซ้อนจะดำเนินการโดยการสลายตัวของความสัมพันธ์ในลักษณะที่จะจัดเก็บเฉพาะข้อเท็จจริงหลักในแต่ละความสัมพันธ์ (นั่นคือข้อเท็จจริงที่ไม่ได้อนุมานจากข้อเท็จจริงที่เก็บไว้อื่น ๆ )

    การพึ่งพาการทำงาน

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

    19. 1NF: คำจำกัดความพื้นฐานและกฎการเปลี่ยนแปลง

    เพื่อหารือเกี่ยวกับรูปแบบปกติครั้งแรก จำเป็นต้องมีคำจำกัดความสองประการ:

    คุณลักษณะที่เรียบง่าย - คุณลักษณะที่มีค่าเป็นอะตอมมิก (แบ่งแยกไม่ได้)

    คุณลักษณะที่ซับซ้อน - ได้มาจากการเชื่อมต่อคุณลักษณะอะตอมมิกหลายตัวที่สามารถกำหนดได้ในโดเมนเดียวกันหรือต่างกัน (เรียกอีกอย่างว่าเวกเตอร์หรือการรวมข้อมูล)

    คำจำกัดความของรูปแบบปกติครั้งแรก:

    ความสัมพันธ์อยู่ใน 1NF หากค่าของคุณลักษณะทั้งหมดเป็นอะตอมมิก . มิฉะนั้นจะไม่ใช่ตารางเลย และแอตทริบิวต์ดังกล่าวจะต้องถูกแยกย่อย

    ลองดูตัวอย่าง:

    ในฐานข้อมูลของแผนกทรัพยากรบุคคลขององค์กรมีความจำเป็นต้องจัดเก็บข้อมูลเกี่ยวกับพนักงานที่สามารถพยายามนำเสนอเกี่ยวกับ

    พนักงาน(EMPLOYEE_NUMBER, ชื่อ, วันเกิด, ประวัติการทำงาน, เด็ก)

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

     JOB_HISTORY (RECEPTION_DATE, NAME, SALARY_HISTORY)

     SALARY_HISTORY (APPOINTMENT_DATE, เงินเดือน)

     เด็ก (CHILD_NAME, BIRTH_YEAR)

    การเชื่อมต่อของพวกเขาแสดงไว้ในรูปที่. 3.3.

    รูปที่.3.3. ทัศนคติเบื้องต้น.

    เพื่อนำความสัมพันธ์ดั้งเดิมของ SERVANT ไปสู่รูปแบบปกติรูปแบบแรก จำเป็นต้องแยกย่อยออกเป็นสี่ความสัมพันธ์ ดังแสดงในรูปต่อไปนี้:

    รูปที่.3.4. ชุดความสัมพันธ์ที่ทำให้เป็นมาตรฐาน

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

    อัลกอริธึมการทำให้เป็นมาตรฐานอธิบายโดย E.F. Codd ดังต่อไปนี้:

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

    20. 2NF: คำจำกัดความพื้นฐานและกฎการเปลี่ยนแปลง

    บ่อยครั้งที่คีย์หลักของความสัมพันธ์ประกอบด้วยคุณลักษณะหลายอย่าง (ซึ่งในกรณีนี้จะเรียกว่า คอมโพสิต) - ดูตัวอย่างความสัมพันธ์ CHILDREN ที่แสดงในรูปที่ 3.4 คำถามข้อ 19. ในขณะเดียวกันก็นำเสนอแนวคิด การพึ่งพาการทำงานเต็มรูปแบบ.

    คำนิยาม:

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

    ตัวอย่าง:

    ให้มีความสัมพันธ์ SUPPLY (N_SUPPLIER, PRODUCT, PRICE)
    ซัพพลายเออร์อาจจัดหาผลิตภัณฑ์ที่แตกต่างกัน และผลิตภัณฑ์เดียวกันอาจจัดหาโดยซัพพลายเออร์ที่แตกต่างกัน จากนั้นคีย์ความสัมพันธ์ก็คือ "N_ซัพพลายเออร์ + ผลิตภัณฑ์". ให้ซัพพลายเออร์ทุกรายจัดหาสินค้าในราคาเดียวกัน จากนั้นเราก็มีการพึ่งพาการทำงานดังต่อไปนี้:

    • N_ซัพพลายเออร์ ผลิตภัณฑ์ -> ราคา
    • ผลิตภัณฑ์ -> ราคา

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

    • การส่งมอบ (N_SUPPLIER, ผลิตภัณฑ์)
    • PRODUCT_PRICE (ผลิตภัณฑ์ ราคา)

    คุณจึงสามารถให้ได้

    คำจำกัดความของรูปแบบปกติที่สอง: ความสัมพันธ์จะอยู่ใน 2NF หากอยู่ใน 1NF และคุณลักษณะที่ไม่ใช่คีย์แต่ละรายการจะขึ้นอยู่กับคีย์โดยสมบูรณ์

    21. 3NF: คำจำกัดความพื้นฐานและกฎการเปลี่ยนแปลง

    ก่อนที่จะพูดถึงรูปแบบปกติที่สาม จำเป็นต้องแนะนำแนวคิด: การพึ่งพาฟังก์ชันสกรรมกริยา.

    คำนิยาม:

    ให้ X, Y, Z เป็นคุณลักษณะสามประการของความสัมพันธ์บางอย่าง ในกรณีนี้ X --> Y และ Y --> Z แต่ไม่มีการโต้ตอบแบบย้อนกลับ นั่นคือ Z -/-> Y และ Y -/-> X จากนั้น Z ขึ้นอยู่กับ X แบบเปลี่ยนผ่าน
    ให้มีความสัมพันธ์กัน STORAGE ( บริษัท, WAREHOUSE, VOLUME) ซึ่งมีข้อมูลเกี่ยวกับบริษัทที่ได้รับสินค้าจากคลังสินค้าและปริมาณของคลังสินค้าเหล่านี้ คุณลักษณะที่สำคัญ - "บริษัท". หากแต่ละบริษัทสามารถรับสินค้าจากคลังสินค้าเพียงแห่งเดียว จะมีการขึ้นต่อกันของฟังก์ชันดังต่อไปนี้:

    • บริษัท -> คลังสินค้า
    • คลังสินค้า -> ปริมาณ

    ในกรณีนี้เกิดความผิดปกติ:

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

    เพื่อกำจัดความผิดปกติเหล่านี้ จำเป็นต้องแยกความสัมพันธ์ดั้งเดิมออกเป็นสองส่วน:

    • พื้นที่จัดเก็บ ( บริษัท, คลังสินค้า)
    • พื้นที่จัดเก็บ_ปริมาณ ( คลังสินค้า, ปริมาณ)

    คำจำกัดความของรูปแบบปกติที่สาม:

    ความสัมพันธ์จะอยู่ใน 3NF หากอยู่ใน 2NF และคุณลักษณะที่ไม่ใช่คีย์แต่ละรายการจะไม่ขึ้นอยู่กับคีย์หลักแบบทรานซิชัน

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

    • คีย์หลัก
    • คีย์ภายนอก
    • คีย์แบบง่ายและแบบผสม
    • ทัศนคติ ประเภทของความสัมพันธ์
    • กุญแจประดิษฐ์และเป็นธรรมชาติ
    • ตารางหลัก (หลัก) และตารางรอง (รายละเอียด)

    ป้อนข้อมูล

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

    ตารางมีโครงสร้างดังนี้

    "คนงาน". ประกอบด้วยข้อมูลพนักงาน "เงินเดือน". มีข้อมูลเกี่ยวกับเงินเดือนพนักงาน

    คำถามคำตอบ

    1. คีย์หลักในตารางฐานข้อมูลคืออะไร? คีย์หลักใช้ทำอะไร?

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

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

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

    ตัวอย่าง.สำหรับตาราง "พนักงาน" คุณสามารถป้อนช่องเพิ่มเติมได้ ซึ่งจะเป็นคีย์หลัก อย่างไรก็ตาม ช่อง "หมายเลขบุคลากร" (แอตทริบิวต์) ยังช่วยรับประกันความเป็นเอกลักษณ์อีกด้วย เนื่องจากตามทฤษฎีแล้ว ไม่สามารถมีหมายเลขบุคลากรที่เหมือนกันสองหมายเลขได้ ในทางปฏิบัติอาจมีบางกรณีที่ป้อนหมายเลขบุคลากรเดียวกันโดยไม่ได้ตั้งใจและค่าของช่องตารางทั้งหมดจะเหมือนกัน ด้วยเหตุนี้ สองระเบียนที่เหมือนกันจะปรากฏในตาราง เพื่อหลีกเลี่ยงข้อผิดพลาดดังกล่าว ควรสร้างฟิลด์ตัวนับเพิ่มเติมในตารางซึ่งจะทำให้ไม่ซ้ำกัน

    คุณยังสามารถป้อนฟิลด์เพิ่มเติมสำหรับตาราง "เงินเดือน" ซึ่งจะเป็นคีย์หลักได้

    2. ความสัมพันธ์ระหว่างตารางคืออะไร? ตัวอย่าง

    ตารางในแบบจำลองข้อมูลเชิงสัมพันธ์สามารถมีความสัมพันธ์ระหว่างกันได้ การเชื่อมต่อดังกล่าวเรียกว่าความสัมพันธ์ สำหรับตาราง "พนักงาน" และ "เงินเดือน" คุณสามารถสร้างการเชื่อมต่อได้โดยใช้ช่อง "หมายเลขบุคลากร"

    ตัวอย่าง.มาวิเคราะห์ตาราง "พนักงาน" และ "เงินเดือน" กัน ในตารางเหล่านี้ คุณสามารถสร้างความสัมพันธ์ระหว่างตารางตามฟิลด์หมายเลขบุคลากรได้ นั่นคือการเชื่อมต่อระหว่างตารางเกิดขึ้นบนพื้นฐานของฟิลด์ (แอตทริบิวต์) "หมายเลขบุคลากร"

    นี่หมายถึงสิ่งต่อไปนี้ หากคุณต้องการค้นหาค่าจ้างสะสมในตาราง "เงินเดือน" สำหรับพนักงาน Ivanov I.I. คุณต้องทำตามขั้นตอนต่อไปนี้:

    • ค้นหาหมายเลขบุคลากรของพนักงาน Ivanov I.I. ในตาราง "พนักงาน" มูลค่าของจำนวนบุคลากรคือ 7585;
    • ในตาราง "เงินเดือน" ค้นหาค่าทั้งหมดที่เท่ากับ 7585 (หมายเลขบุคลากร)
    • เลือกจากตาราง "เงินเดือน" ค่าทั้งหมดของช่อง "ค้างรับ" ที่สอดคล้องกับหมายเลขบุคลากร 7585

    ข้าว. 1. ภาพประกอบความสัมพันธ์ระหว่างตาราง บุคลากรหมายเลข 2145 ของตาราง “พนักงาน” จะแสดงอยู่ในตาราง “เงินเดือน”

    ข้าว. 2. การเชื่อมต่อ (ความสัมพันธ์) ระหว่างเขตข้อมูลตาราง

    3. คีย์ต่างประเทศคืออะไร? ตัวอย่าง

    แนวคิดของ "คีย์ต่างประเทศ" มีความสำคัญเมื่อพิจารณาตารางที่เกี่ยวข้อง

    กุญแจภายนอก– คือหนึ่งหรือหลายฟิลด์ (แอตทริบิวต์) ที่เป็นข้อมูลหลักในตารางอื่นและมีค่าถูกแทนที่ด้วยค่าของคีย์หลักของตารางอื่น

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

    4. คีย์ต่างประเทศแบบเรียกซ้ำคืออะไร?

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

    5. คีย์หลักและคีย์นอกสามารถเป็นแบบธรรมดาหรือแบบผสม (ซับซ้อน) ได้หรือไม่?

    คีย์หลัก คีย์รอง และคีย์นอกอาจเป็นคีย์ธรรมดาหรือคีย์ผสม (ซับซ้อน) ปุ่มง่ายๆ– นี่คือคีย์ที่มีเพียงฟิลด์เดียว (หนึ่งแอตทริบิวต์) คอมโพสิตคีย์ (ซับซ้อน) คือคีย์ที่ประกอบด้วยหลายฟิลด์ (แอตทริบิวต์)

    6. กุญแจเทียมและกุญแจธรรมชาติแตกต่างกันอย่างไร? ตัวอย่าง

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

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

    ตัวอย่าง.ในตาราง "พนักงาน" คีย์ธรรมชาติคือฟิลด์ (แอตทริบิวต์) "หมายเลขบุคลากร" ช่อง "หมายเลขบุคลากร" มีลักษณะเฉพาะในตัวเอง เนื่องจากไม่สามารถมีพนักงานสองคนที่มีหมายเลขบุคลากรเดียวกันได้

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

    โดยที่ช่อง "หมายเลข" เป็นคีย์เทียมที่รับประกันความเป็นเอกลักษณ์

    7. วิธีต่างๆ ในการเลือกคีย์หลักมีอะไรบ้าง?

    มี 3 วิธีในการเลือกคีย์หลัก:

    • ใช้ฟิลด์ส่วนเพิ่ม (ฟิลด์ตัวนับ) เป็นคีย์เทียม
    • เลือกหนึ่งฟิลด์จากข้อมูลที่สามารถให้ความเป็นเอกลักษณ์ได้
    • เลือกหลายฟิลด์จากข้อมูลที่สามารถให้ความเป็นเอกลักษณ์ได้ ในกรณีนี้คีย์จะถูกเรียกว่าซับซ้อน (คอมโพสิต)
    8. คำว่า “โต๊ะหลัก” (ต้นแบบ) และ “โต๊ะรอง” (รายละเอียด) หมายถึงอะไร?

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

    ตัวอย่าง.หากเราพิจารณาตาราง "พนักงาน" และ "เงินเดือน" ตาราง "พนักงาน" จะเป็นตารางหลักและตาราง "เงินเดือน" จะเป็นตารางรอง

    9. ความสัมพันธ์ (ลิงก์) ประเภทใดที่มีอยู่ระหว่างตาราง?

    ความสัมพันธ์ระหว่างตารางมี 4 ประเภทหลัก:

    • "หนึ่งต่อหนึ่ง". ในกรณีนี้ แต่ละบันทึกของตารางหนึ่งจะสอดคล้องกับบันทึกเดียวของตารางอื่นเท่านั้น
    • "หนึ่งต่อหลาย". นี่คือเมื่อหนึ่งบันทึกของตารางหลัก (หลัก) สอดคล้องกับหลายบันทึกของตารางรอง (รายละเอียด) นั่นคือ แต่ละเรกคอร์ดที่เป็นคีย์หลักของตารางหนึ่งจะสอดคล้องกับหลายเรกคอร์ดของตารางที่เกี่ยวข้อง
    • "หลายต่อหนึ่ง". นี่คือเมื่อหลายบันทึกของตารางหลักตรงกับหนึ่งบันทึกของตารางรอง
    • "หลายต่อหลาย". นี่คือเมื่อมีเรกคอร์ดที่เกี่ยวข้องหลายรายการในทั้งสองตาราง

    ตัวอย่าง.หากเราพิจารณาความสัมพันธ์ระหว่างตาราง "พนักงาน" และ "เงินเดือน" ความสัมพันธ์นี้จะเป็นประเภท "หนึ่งต่อกลุ่ม" ตาราง "พนักงาน" เป็นตารางหลัก ตาราง “เงินเดือน” เป็นตารางรอง