מפתח זר

מפתח זר (באנגלית: Foreign Key) במסדי נתונים הוא מונח מעולם מסדי הנתונים היחסיים, המתאר שדה (עמודה) בטבלה אשר ערכיו האפשריים (Domain) נשאבים משדה מקביל בטבלה אחרת אשר בה משמש השדה כמפתח ראשי.

ערכי המפתח הזר אינם בלעדיים (Unique) בטבלת הבן (הטבלה שמכילה מפתח זר) ויכולים לחזור על עצמם. המפתח הזר הוא לעולם לא ריק, מאחר שהוא מצביע למפתח ראשי שתמיד חייב להכיל ערך ייחודי (למשל ת.ז של האב). מפתח זר כמו מפתח ראשי יכול להיות מפתח מורכב, כלומר מפתח שמכיל בתוכו מספר ערכים.

ניתן להגדיר קשר זה כאילוץ מפורש (Constraint) בהגדרת הטבלה, כך שמערכת ניהול מסד הנתונים (DBMS) תמנע מופעים של המפתח הזר שאינם עונים לאילוץ, כלומר אינם נמצאים בטבלת האב. כתוצאה מהגדרת אילוץ כזה, לא נוכל גם למחוק רשומה מטבלת האב כל עוד ישנן רשומות בטבלת הבן המכילות את מפתח הרשומה כמפתח זר.

על ידי שימוש במפתח זר מגדירים ולמעשה יוצרים את הקשרים בין הטבלאות השונות במסד הנתונים.

דוגמאות למפתחות זרים

מסדי נתונים
נתונות שתי הטבלאות הבאות: טבלה של חברות שמייצרות ממתקים וטבלה של ממתקים.
לכל חברה יש מספר ייחודי משלה (מזהה חברה) שאינו יכול להתקיים עבור שתי חברות, כלומר הוא מפתח ראשי של הטבלה.
בטבלת הממתקים, ישנה עמודה של מזהה חברה - כלומר הפנייה לטבלת החברות.
מספר ממתקים יכולים להצהיר שהחברה שמייצרת אותם היא אותה חברה, כלומר העמודה מזהה חברה הוא מפתח זר בטבלת הממתקים.
זהו קשר של רבים ליחיד: לכל ממתק יש רק חברה אחת שמייצרת אותו, ומצד שני כל חברה מייצרת הרבה ממתקים.

מניתוח של הנתונים אפשר להסיק את הבאות:
 חברת אטראוס מייצרת רק את הממתק נקופלת.
 חברת פלית מייצרת את הממתקים נילקי וליפלי.
 חברת לרמית מייצרת את הממתקים אמבה וגיסלי.

אם מספר חברות יכולות לייצר את אותן הממתקים (שלא כמו בדוגמה הקודמת שכל ממתק מיוצר רק על ידי חברה אחת) אז יש להיעזר בקשר הנקרא קשר של רבים לרבים. קשר זה מושג על ידי טבלת קשר שמצליבה בין מזהה ייחודי של ממתק (מפתח ראשי) לבין מזהה ייחודי של חברה (מפתח ראשי). בטבלה זו דוגמה למפתח ראשי מורכב: הוא מכיל שני שדות שכל אחד מהם הוא מפתח זר לטבלאות האחרות, להלן דוגמה:

ניתוח של המידע בטבלת הקשר מעלה את הבאים:
 חברת פלית מייצרת נילקי, נקופלת ואמבה.
 חברת אטראוס מייצרת נקופלת, אמבה וליפלי.
 חברת לרמית מייצרת אמבה, ליפלי וגיסלי.

de:Schlüssel (Datenbank)#Fremdschlüssel
no:Nøkkel (database)#Fremmednøkkel