มุมมองจำเป็นต้องมีข้อ จำกัด กุญแจต่างประเทศของตัวเองหรือไม่?


10

คำเตือน: ฉันเป็นโปรแกรมเมอร์ไม่ใช่ DBA ดังนั้นทนกับฉัน ...

ฉันมีมุมมองที่ฉันใช้เพื่อจับคู่เอนทิตี 2 รายการเข้าด้วยกัน ฉันต้องเข้าร่วมระหว่างตารางที่แตกต่างกันสองสามเพื่อให้ได้:

CREATE OR REPLACE VIEW V_SCREENING_GROUP_SITES AS (
SELECT SG.SCREENING_GROUP_ID, V.SITE_ID
FROM SCREENING_GROUP SG, VISIT V, VISIT_DATE VD
WHERE VD.VISIT_ID = V.VISIT_ID 
AND V.SCREENING_GROUP_ID = SG.SCREENING_GROUP_ID);

ด้านบนเป็นเพียงบริบทไม่ต้องกังวลมากเกินไป สิ่งที่ฉันต้องรู้คือวิธีสร้างฟิลด์ในมุมมอง V_SCREENING_GROUP_SITES ใหม่ของฉัน (SCREENING_GROUP_ID และ SITE_ID) ทำหน้าที่เป็นคีย์ต่างประเทศในตาราง SCREENING_GROUP และ SITE หรือว่ามันสำคัญ

ถ้าเป็นตารางฉันจะทำ:

ALTER TABLE V_SCREENING_GROUP_SITES
ADD CONSTRAINT FK_SCREENING_GROUP_ID
FOREIGN KEY (SCREENING_GROUP_ID)
REFERENCES SCREENING_GROUP.SCREENING_GROUP_ID;
...

แต่เนื่องจากเป็นมุมมองที่เห็นได้ชัดว่าใช้งานไม่ได้ ฉันหาไวยากรณ์ ALTER VIEW ที่ใช้สำหรับการตั้งค่า FK ไม่ได้ ฉันควรทำอย่างไรดี?

(นี่คือฐานข้อมูล MySQL)

คำตอบ:


12

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


1
เยี่ยมมากดังนั้นฉันไม่จำเป็นต้องทำอะไรเลย (ข้อ จำกัด FK มีอยู่แล้วในตารางที่ขีดเส้นใต้) ขอบคุณสำหรับคำตอบ.
ทรอย

1
ฉันคิดว่านี่เป็นจุดที่จะทำให้ คุณไม่จำเป็นต้องใช้ FK ในมุมมองตราบใดที่ตารางต้นแบบมี FK
Derek Downey

2
@DTest - มันจะมีประโยชน์มากที่จะสามารถใช้ข้อ จำกัด รวมถึงการตรวจสอบข้อ จำกัด คีย์ที่ไม่ซ้ำกันและต่างประเทศกับมุมมอง (โดยเฉพาะอย่างยิ่งถ้ามุมมองที่รวบรวมข้อมูล) มันเกิดขึ้นที่ไม่มี RDBMS ปัจจุบันบังคับใช้ข้อ จำกัด ในมุมมองแม้ว่าจะอนุญาตให้คุณสร้างได้
แจ็คบอกว่าลอง topanswers.xyz

@JackDouglas ถูกต้องแล้ว! อันที่จริงฉันมาที่นี่เพื่อค้นหาว่า MySQL รองรับคุณสมบัติดังกล่าวหรือไม่
Stijn de Witt

3

ในความหมายที่เข้มงวดของคำศัพท์คุณไม่สามารถตั้งค่าคีย์ต่างประเทศในมุมมองได้ นี่คือเหตุผล:

InnoDB เป็นเครื่องมือเก็บข้อมูลในตัวสำหรับ MySQL ที่มีคีย์ต่างประเทศ ตาราง InnoDB ใด ๆ จะถูกลงทะเบียนในinformation_schema.tablesพร้อมกับ engine = 'InnoDB'

Views ขณะที่ลงทะเบียนใน information_schema.tables มีเอ็นจิ้นการจัดเก็บ NULL ไม่มีกลไกใน MySQL ที่จะมีรหัสต่างประเทศในตารางใด ๆ ที่มีเครื่องมือจัดเก็บข้อมูลที่ไม่ได้กำหนด

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