คำถามติดแท็ก foreign-key

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

2
ค้นหาคีย์ต่างประเทศที่เกี่ยวข้องกับคีย์หลักที่กำหนด
ฉันต้องการวิธีในการสร้างคอลัมน์ในฐานข้อมูลที่กำหนดที่จะเข้าร่วมผ่านความสัมพันธ์ PK / FK ฉันสามารถส่งคืนข้อมูล PK / FK สำหรับตารางที่กำหนดผ่าน SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS cu WHERE EXISTS ( SELECT tc.* FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc WHERE tc.CONSTRAINT_CATALOG = 'MyDatabase' AND tc.TABLE_NAME = 'MyTable' /*AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'*/ AND tc.CONSTRAINT_NAME = cu.CONSTRAINT_NAME); GO แต่สำหรับ PK ที่ส่งคืนจากคิวรีดังกล่าวฉันจะสร้าง FK ที่เชื่อมโยงได้อย่างไร (สมมติว่ามี) ฉันรู้ว่าคุณยังสามารถรับตารางอ้างอิงผ่าน: SELECT …

3
ดัชนีคอลัมน์แบบคลัสเตอร์และคีย์ต่างประเทศ
ฉันกำลังปรับแต่งคลังข้อมูลโดยใช้ดัชนี ฉันค่อนข้างใหม่กับ SQL Server 2014 Microsoft อธิบายต่อไปนี้: "เราดูดัชนี columnstore ของคลัสเตอร์เป็นมาตรฐานสำหรับการจัดเก็บตารางข้อมูลคลังข้อมูลขนาดใหญ่และคาดว่าจะใช้ในสถานการณ์จำลองคลังข้อมูลส่วนใหญ่เนื่องจากดัชนี columnstore ของคลัสเตอร์สามารถอัปเดตได้เวิร์กโหลดของคุณสามารถทำการแทรกจำนวนมาก และลบการทำงาน " http://msdn.microsoft.com/en-us/library/gg492088.aspx อย่างไรก็ตามหากคุณอ่านเพิ่มเติมในเอกสารคุณจะพบภายใต้ข้อ จำกัด และข้อ จำกัด : "ไม่สามารถมีข้อ จำกัด ที่ไม่ซ้ำกันข้อ จำกัด ของคีย์หลักหรือข้อ จำกัด ของ Foreign Key" ทำให้ฉันงงมาก! เป็นวิธีปฏิบัติที่ดี (ไม่บังคับ) ให้มีคีย์ต่างประเทศในคลังข้อมูลด้วยเหตุผลหลายประการ (ความสมบูรณ์ของข้อมูลความสัมพันธ์ที่มองเห็นได้สำหรับเลเยอร์ความหมาย ... ) ดังนั้นไมโครซอฟท์จึงสนับสนุนการจัดทำดัชนีคอลัมน์แบบจัดกลุ่มสำหรับสถานการณ์คลังข้อมูล แต่มันไม่สามารถจัดการกับความสัมพันธ์ที่สำคัญกับต่างประเทศได้! ฉันถูกต้องหรือไม่ วิธีอื่นใดที่คุณจะแนะนำ ในอดีตที่ผ่านมาฉันใช้ดัชนี columnstore ที่ไม่ใช่คลัสเตอร์ในสถานการณ์ data warehouse โดยมีการปล่อยและสร้างใหม่สำหรับการโหลดข้อมูล อย่างไรก็ตาม SQL Server 2014 …

4
ดึง PK และ FK ทั้งหมด
ฉันมีฐานข้อมูลขนาดใหญ่ที่ฉันต้องการแยกคีย์หลักและคีย์ต่างประเทศทั้งหมดจากแต่ละตาราง ฉันมี pgAdmin III มีวิธีการทำเช่นนี้โดยอัตโนมัติและไม่ข้ามแต่ละตารางด้วยตนเอง?

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

1
ปิดใช้งานข้อ จำกัด ก่อนใช้ pg_restore.exe
เมื่อฉันพยายามเรียกใช้pg_restore.exeงานไฟล์ดัมพ์จากฐานข้อมูลมันก็จะพ่นข้อผิดพลาดออกมาหลายสิบข้อทั้งหมดเหมือนกัน: ERROR: insert or update on table "someTable" violates foreign key constraint "aConstraintName" เห็นได้ชัดว่าเป็นเพราะความจริงที่ว่าฉันได้ลบฐานข้อมูลก่อนที่จะกู้คืนจากไฟล์การถ่ายโอนข้อมูล (ไฟล์นี้มาจากฐานข้อมูลการผลิต) ... แล้วแน่นอนไม่มีข้อ จำกัด กุญแจต่างประเทศสามารถตกลงถ้าตารางอ้างอิงหนึ่งที่ว่างเปล่า ... มีวิธีปิดใช้งานข้อ จำกัด และคีย์ต่างประเทศทั้งหมดสำหรับตารางทั้งหมดก่อนที่ฉันจะโทรpg_restore.exeและหลังจากนั้นเปิดใช้งานข้อ จำกัด และคีย์ต่างประเทศอีกครั้ง ดังนั้นในการที่ฉันได้พบสิ่งที่น่าสนใจ: ชะลอการ จำกัด การตรวจสอบเพื่อกระทำเวลา แต่ฉันไม่คิดว่าฉันสามารถโทรpg_restore.exeจากภายในได้psql.exeหลังจากชะลอข้อ จำกัด นอกจากนี้ยังมีโพสต์นี้ย้อนหลังไปเมื่อ 10 ปีก่อนแนะนำให้วางแล้วเพิ่มข้อ จำกัด อีกครั้ง หรือเปลี่ยนค่าของ pg_class reltriggers เป็น 0 และนั่นอาจเป็นไปได้สำหรับข้อ จำกัด ... แต่ฉันเกรงว่ามันแฮ็คมากกว่าการฝึกฝนที่ดี ... คุณแนะนำอะไรแนวทางปฏิบัติที่ดีที่สุดในกรณีนี้คืออะไร การใช้pg_dump.exe กับ-cleanแฟล็กจะสร้างดัมพ์ที่ข้ามข้อ จำกัด …

4
รวมตัวเองแบบเรียกซ้ำ
ฉันมีcommentsตารางซึ่งสามารถทำให้ง่ายลงไปนี้: comments ======= id user_id text parent_id โดยที่parent_idnullable แต่อาจเป็นกุญแจสำคัญสำหรับความคิดเห็นหลัก ตอนนี้ฉันจะselectทายาทของความคิดเห็นเฉพาะได้อย่างไร ความคิดเห็นอาจลดลงหลายระดับ ...

2
SET NULL มีวัตถุประสงค์ในการลบ / อัพเดทข้อ จำกัด กุญแจต่างประเทศอย่างไร?
ฉันอาจจะใจแคบ แต่ถ้าฉันสร้างข้อ จำกัด คีย์ต่างประเทศและแถวได้รับการปรับปรุงหรือลบฉันจะสูญเสียการเชื่อมต่อนั้นถ้าคอลัมน์ของตารางลูกได้รับการตั้งค่าเป็นโมฆะ อะไรคือจุดประสงค์ของการเก็บแถวกำพร้าเหล่านี้ไว้โดยเจตนา?
15 foreign-key  null 

2
แนวทางปฏิบัติที่ดีที่สุดเกี่ยวกับตารางการค้นหาในฐานข้อมูลเชิงสัมพันธ์คืออะไร
ตารางการค้นหา (หรือตารางรหัสตามที่บางคนเรียกพวกเขา) มักจะเป็นชุดของค่าที่เป็นไปได้ที่สามารถกำหนดสำหรับคอลัมน์ที่แน่นอน ตัวอย่างเช่นสมมติว่าเรามีตารางการค้นหาที่เรียกว่าparty(หมายถึงการเก็บข้อมูลเกี่ยวกับพรรคการเมือง) ที่มีสองคอลัมน์: party_code_idnซึ่งเก็บค่าตัวเลขที่ระบบสร้างขึ้นและ (ขาดความหมายโดเมนธุรกิจ ) ทำงานเป็นตัวแทนสำหรับคีย์จริง party_codeเป็นกุญแจจริงหรือ "ธรรมชาติ" ของตารางเนื่องจากจะรักษาค่าที่มีนัยยะของโดเมนธุรกิจ และให้เราบอกว่าตารางดังกล่าวเก็บข้อมูลที่ตามมา: +----------------+------------+ | party_code_idn | party_code | +----------------+------------+ | 1 | Republican | | 2 | Democratic | +----------------+------------+ party_codeคอลัมน์ซึ่งช่วยให้ค่า 'รีพับลิกัน' และ 'ประชาธิปไตย' เป็นสำคัญที่แท้จริงของตารางมีการตั้งค่าที่มีข้อ จำกัด ที่ไม่ซ้ำกัน แต่ผมเลือกที่จะเพิ่มparty_code_idnและกำหนดเป็น PK ของตาราง (แม้ว่าเหตุผลที่พูด , party_codeอาจทำงานเป็นคีย์หลัก [PK]) คำถาม แนวปฏิบัติที่เหมาะสมที่สุดสำหรับการชี้ไปยังค่าการค้นหาจากตารางธุรกรรมคืออะไร ฉันควรสร้างการอ้างอิงต่างประเทศ (FK) อ้างอิงทั้ง(a)โดยตรงกับค่าที่เป็นธรรมชาติและมีความหมายหรือ(b)เพื่อแทนค่า? …

2
ความสัมพันธ์กับคีย์ต่างประเทศแบบมีเงื่อนไข
ขณะนี้ฉันมีรหัสต่างประเทศระหว่างสองหน่วยงานและฉันต้องการสร้างความสัมพันธ์แบบมีเงื่อนไขให้กับประเภทรายการของตารางใดตารางหนึ่ง นี่คือลำดับชั้นของตารางซึ่งทำได้ผ่านการอ้างอิง FK ตั้งแต่เด็กจนถึงผู้ปกครอง Store / \ Employees \ TransactionalStores / | \ Kiosks | BrickMortars Onlines ขณะนี้ฉันมีความสัมพันธ์ FK จากพนักงานเพื่อจัดเก็บ ALTER TABLE Employees ADD CONSTRAINT Employee_Store FOREIGN KEY (TransStoreId) REFERENCES TransactionalStores(StoreId) ฉันต้องการเพิ่มเงื่อนไข: WHERE TransactionalStores.storeType != 'ONLINE_TYPE' เป็นไปได้หรือไม่ฉันต้อง subclass TransactionalStores เป็นสองประเภทย่อยใหม่ (เช่น PhysicalStores และ VirtualStores)

3
กุญแจต่างประเทศ - ลิงค์ใช้ตัวแทนเสมือนหรือกุญแจธรรมชาติ?
มีวิธีปฏิบัติที่ดีที่สุดหรือไม่ว่าคีย์ต่างประเทศระหว่างตารางควรเชื่อมโยงกับคีย์ธรรมชาติหรือคีย์ตัวแทน? การสนทนาเดียวที่ฉันพบ (ยกเว้น google-fu ของฉัน) คือคำตอบของแจ็คดักลาสในคำถามนี้และเหตุผลของเขาดูเหมือนจะฟังฉัน ฉันตระหนักถึงการอภิปรายเกินกว่าที่กฎจะเปลี่ยนแปลง แต่นี่จะเป็นสิ่งที่ต้องพิจารณาในทุกสถานการณ์ เหตุผลหลักในการถามคือฉันมีแอปพลิเคชั่นรุ่นเก่าที่ใช้ประโยชน์จาก FKs ด้วยปุ่มธรรมชาติ แต่มีแรงผลักดันจาก devlopers ที่จะย้ายไปยัง OR / M (NHibernate ในกรณีของเรา) และส้อมได้สร้างบางอย่างแล้ว ทำลายการเปลี่ยนแปลงดังนั้นฉันจึงกำลังมองหาที่จะผลักพวกเขากลับมาในการติดตามโดยใช้คีย์ธรรมชาติหรือย้ายแอปรุ่นเก่าเพื่อใช้คีย์ตัวแทนสำหรับ FK ไส้ของฉันบอกว่าจะคืนค่า FK ดั้งเดิม แต่ฉันก็ไม่แน่ใจว่านี่เป็นเส้นทางที่ถูกต้องจริงๆหรือไม่ ตารางส่วนใหญ่ของเรามีทั้งคีย์ตัวแทนและคีย์ธรรมชาติที่กำหนดไว้แล้ว (แม้ว่าจะมีข้อ จำกัด ที่ไม่ซ้ำกันและ PK) ดังนั้นการเพิ่มคอลัมน์เพิ่มเติมจึงไม่ใช่ประเด็นสำหรับเราในเรื่องนี้ เรากำลังใช้ SQL Server 2008 แต่ฉันหวังว่านี่จะเพียงพอสำหรับฐานข้อมูลใด ๆ

2
เหตุใดการวางกุญแจต่างประเทศจึงใช้เวลานาน?
ฉันได้สร้างสคริปต์ที่หนึ่งครั้งลบกุญแจต่างประเทศทั้งหมดจากฐานข้อมูลเช่นนี้: ALTER TABLE MyTable1 DROP CONSTRAINT FK_MyTable1_col1 ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col1 ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col2 สิ่งที่ทำให้ฉันประหลาดใจคือสคริปต์ใช้เวลานาน: โดยเฉลี่ย 20 วินาทีสำหรับแต่ละ DROP FK ตอนนี้ฉันเข้าใจว่าการสร้าง FK อาจเป็นเรื่องใหญ่เพราะเซิร์ฟเวอร์ต้องดำเนินการและตรวจสอบว่าข้อ จำกัด FK ไม่ได้ถูกละเมิดตั้งแต่เริ่มแรก แต่เป็นการลดลงใช่ไหม เซิร์ฟเวอร์ทำอะไรเมื่อปล่อย FKs ที่ใช้เวลานาน นี่เป็นทั้งความอยากรู้อยากเห็นของฉันเองและเพื่อให้เข้าใจว่ามีวิธีที่จะทำให้สิ่งต่าง ๆ เร็วขึ้นหรือไม่ ความสามารถในการลบ FK (ไม่ใช่แค่ปิดการใช้งาน) จะช่วยให้ฉันเร็วขึ้นมากในระหว่างการย้ายข้อมูลและลดเวลาหยุดทำงาน

5
มันเป็นความคิดที่ดีหรือไม่ที่จะสร้าง foreign key บนตารางใน schema ที่แตกต่างกันในฐานข้อมูลเดียวกันสำหรับแอปพลิเคชันขนาดใหญ่?
ฉันกำลังทำงานกับการถ่ายโอนแอปพลิเคชันบนเว็บขนาดใหญ่ / sql ไปยังเซิร์ฟเวอร์เฉพาะ แอปพลิเคชันนี้อยู่ในสคีมาเดียวกับ 70 แพ็คเกจของโค้ดโปรแกรม แอปพลิเคชั่นนี้สร้างขึ้นประมาณ 15 คนในเวลาที่ต่างกัน และมันก็เป็นเรื่องปกติที่เราจะต้องสร้างกุญแจต่างประเทศในตารางอ้างอิงในแบบแผนต่าง ๆ เพราะมันมีความมั่นใจและรักษาฐานข้อมูลได้ดีมากเพราะเราไม่จำเป็นต้องเก็บตารางการอ้างอิงเดียวกันไว้ในแบบแผนต่าง ๆ แต่อย่างไรก็ตาม DBA ของฉัน (ผู้ที่สร้างอินสแตนซ์ใหม่ด้วย DB และคัดลอกแอปพลิเคชันของฉันภายในโซนโซลาริส) กล่าวว่ารุนแรงมากในวันนี้ "กุญแจต่างประเทศใน schemas ที่แตกต่างกันนั้นชั่วร้ายและคุณต้องทำลายมัน!" เขาไม่ได้อธิบายมุมมองของเขา เป็นความคิดที่ดีหรือไม่ที่ทำเช่นนั้นกับแอพพลิเคชั่นขนาดใหญ่?

3
อะไรจะหายไปเมื่อฉันสร้าง Foreign Key โดยใช้ "WITH NOCHECK"
ฉันรู้ว่าถ้าฉันEXISTS()โทรหาค่าการค้นหา FK ดังนั้นถ้าข้อ จำกัด FK นั้นเชื่อถือได้ผลลัพธ์จะเป็นทันที และถ้ามันไม่น่าเชื่อถือ (เช่นเมื่อฉันสร้าง FK โดยใช้WITH NOCHECK) แล้ว SQL Server จะต้องไปและตรวจสอบตารางเพื่อดูว่าค่านั้นมีจริง มีอะไรอีกบ้างที่ฉันแพ้โดยใช้NOCHECK?

2
ทริกเกอร์ FOR FOR EACH STATEMENT จะเรียกใช้งานบ่อยแค่ไหนหากการดำเนินการเกิดจากข้อ จำกัด FK ที่มี CASCADE UPDATE
ผมเข้าใจว่าทริกเกอร์บนเสื้อตารางที่กำหนดไว้กับจะทำงานเมื่อตอนที่ผมดำเนินการFOR EACH STATEMENTUPDATE t ... ทีนี้เมื่อtถูกกำหนดด้วยFOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADEและฉันอัพเดทแถว N แถวaนั่นจะทำให้ทริกเกอร์ถูกเรียกครั้งเดียวหรือครั้ง N หรือไม่? สิ่งที่แตกต่างกันคือการเปลี่ยนแปลงในตารางที่เรียงซ้อนกันโดยข้อ จำกัด FK เป็นแบบเดี่ยวUPDATEมากกว่าหรือมากกว่าแบบอนุกรมUPDATEหรือไม่?

3
เรียงซ้อนการอัปเดตคีย์หลักเป็นคีย์ต่างประเทศที่อ้างอิงทั้งหมด
เป็นไปได้หรือไม่ที่จะอัพเดตค่าคอลัมน์คีย์หลักที่มีการเรียงซ้อนการอัพเดตระหว่างคีย์ต่างประเทศทั้งหมดที่อ้างถึง? # แก้ไข 1: เมื่อฉันเรียกใช้แบบสอบถาม followinq select * from sys.foreign_keys where referenced_object_id=OBJECT_ID('myTable') ฉันเห็นว่า update_referential_action ตั้งเป็น 0 ดังนั้นจะไม่มีการดำเนินการใด ๆ หลังจากอัปเดตคอลัมน์คีย์หลักของฉัน ฉันจะอัปเดตคีย์ต่างประเทศเพื่อใช้เป็นCASCADE UPDATE ได้อย่างไร # EDIT 2: เพื่อให้สคริปต์ออกสร้างหรือวางกุญแจต่างประเทศทั้งหมดในสคีมาของคุณให้เรียกใช้สคริปต์ต่อไปนี้ (นำมาจากที่นี่ ) DECLARE @schema_name sysname; DECLARE @table_name sysname; DECLARE @constraint_name sysname; DECLARE @constraint_object_id int; DECLARE @referenced_object_name sysname; DECLARE @is_disabled bit; DECLARE @is_not_for_replication bit; DECLARE …

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