מפתחות ראשיים ב-MySQL

הסבר על Primary Keys וכיצד לבצע יצירה, עדכון או מחיקה

במאמר הקודם למדנו על סוגי המנועים השונים ב-MySQL. עכשיו נותר לנו ללמוד על מפתחות – אחד החלקים החשובים בטבלה.

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

ב-MySQL ישנם 3 סוגי מפתחות וכל מפתח מוגדר כאינדקס. אינדקס, למי שלא קרא את המאמר שהסביר על האינדקסים בפירוט, הוא בעצם מנגנון שעוזר ל-MySQL לשלוף מידע ביעילות רבה יותר. 3 סוגי המפתחות ב-MySQL הם: מפתח ראשי (Primary key) מפתח ייחודי (Unique Key) ומפתח זר (Foreign key).

מפתח ראשי

מפתח ראשי הוא בעצם ה-מפתח של הטבלה. אליו קשורים (בטבלה שעברה נירמול מסדר גודל 3) כל שאר השדות בטבלה. המפתח הראשי הוא גם ייחודי, כלומר – כל ערך בו מופיע פעם אחת בלבד. בדרך כלל מקובל מאד שהמפתח הייחודי יכיל מספר – כך גם קל הרבה יותר למצוא אותו בעזרת האינדקס שלו. (כזכור כל מפתח הוא גם אינדקס ואינדקסים של מספרים יותר יעילים).
מפתח ראשי יכול להיות מספר תעודת זהות, מספר מ-1 ועד אינסוף שנקבע לפי סדר הכנסת השורות (שורה ראשונה שנכנסת מקבלת 1, זו שאחריה 2 וכך הלאה והלאה), שם פרטי + משפחה (יהיו בעיות אם יש מישהו עם שם זהה, הנתון שלו לא ייכנס).

ברוב המקרים המפתח הראשי הוא מספר מ-1 עד אינסוף שנבחר לפי סדר הכנסת השורות. כך הלקוח הראשון שייכנס לטבלה יקבל id=1, הלקוח השני שייכנס לבטלה יקבל id=2 וכך הלאה. בעוד שאנו יכולים להגדיר את המספר, ניתן לעשות את זה באופן אוטומטי באמצעות הפקודה AUTO_INCREMENT. שדה שמוגדר כ-AUTO_INCREMENT ימוספר באופן אוטומטי מ-1.

במקרה כזה, מקובל לתת למפתח הראשי שלנו את סוג הנתון SERIAL שהוא מספר לא שלילי (unsigned) ואינו יכול להיות NULL. שזה בדיוק מתאים למפתח ראשי שכאמור אינו יכול להיות ריק (שלילי הוא יכול להיות).

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


CREATE TABLE costumers (costumer_id SERIAL PRIMARY KEY, costumer_first_name VARCHAR (20), costumer_last_name VARCHAR (20), costumer_year_of_birth TINYINT);

כפי שקל לראות מהשאילתה, די בהוספת PRIMARY KEY לשדה על מנת להפוך אותו לשדה של מפתח ראשי.

תיווצר לנו טבלה שבה יש PRIMARY KEY. אם אני אעשה DESCRIBE לטבלה שלי, אני אוכל לראות אותו.


+------------------------+---------------------+------+-----+---------+----------------+
| Field                  | Type                | Null | Key | Default | Extra       |
+------------------------+---------------------+------+-----+---------+----------------+
| costumer_id            | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| costumer_first_name    | varchar(20)         | YES  |     | NULL    |       |
| costumer_last_name     | varchar(20)         | YES  |     | NULL    |       |
| costumer_year_of_birth | tinyint(4)          | YES  |     | NULL    |       |
+------------------------+---------------------+------+-----+---------+----------------+

מחיקת PRIMARY KEY תעשה באופן הבא:


ALTER TABLE costumers DROP PRIMARY KEY;

חשוב להדגיש ש-SERIAL משמש אך ורק ל-PRIMARY KEY, אם השתמשתם ב-SERIAL להגדרת השדה ואתם רוצים להוריד את ה-PRIMARY KEY, עליכם לשנות את סוג המידע של השדה.

אם אני רוצה להוסיף PRIMARY KEY לטבלה קיימת, אני עושה זאת כך:


ALTER TABLE costumers ADD PRIMARY KEY (costumer_id);

יצירת PRIMARY KEY מכמה שדות משולבים יחדיו.

לעתים יש צורך בשילוב של מספר שדות על מנת ליצור מהם PRIMARY KEY מאוחד. MySQL מאפשר את זה בתנאים הבאים : עד 16 שדות ועד אורך 256 ביטים. עושים את זה בדרך כלל על מנת ליצור מפתחות טבעיים – כך למשל אפשר להשתמש בשם האדם כ-PRIMARY KEY במידה ומדובר במערכת שבה אנו יודעים ששם האדם הוא ערך ייחודי. על מנת להשתמש בשם האדם אנו צריכים להשתמש ב-PRIMARY KEY המורכב משם המשפחה שלו ושמו הפרטי.

הוספת PRIMARY KEY לכמה שדות בטבלה קיימת.


ALTER TABLE costumers ADD PRIMARY KEY (costumer_last_name, costumer_first_name);

הורדת ה-PRIMARY KEY מכמה שדות זהה להורדה משדה אחד.

מפתח ייחודי

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

⚠️המדריכים כאן הם טעימה בלבד! יש ספר מקיף המלמד MySQL מרמת בסיס ועד רמה מתקדמת. הספר הדיגיטלי, שרלוונטי גם לכל מסדי הנתונים שעובדים עם SQL – זמין כאן כחלק מהפרויקט "ללמוד ג'אווהסקריפט בעברית" – זו הדרך הטובה ביותר ללמוד באופן מקיף MySQL.

במאמר הבא אנו נלמד על מפתחות זרים ב-MySQL.

פוסטים נוספים שכדאי לקרוא

פתרונות ומאמרים על פיתוח אינטרנט

רינדור של קליינט סייד עם SSR

הסבר קצר על SSR מול רינדור קלאסי ולא. לא תמיד זה טוב להשתמש בו. אין כדור כסף שיכול לפתור הכל.

פתרונות ומאמרים על פיתוח אינטרנט

יישום של nonce על מנת להגן מפני התקפות injection

בפוסט הקודם הסברתי על hash עם CSP על משאבי inline – שזה נחמד ומעולה אבל פחות ישים בעולם האמיתי שבו בדרך כלל התוכן ה-inline (בין

פתרונות ומאמרים על פיתוח אינטרנט

המנעו מהעלאת source control לשרת פומבי

לא תאמינו כמה אתרים מעלים את ה-source control שלהם לשרת. ככה תמצאו אותם וגם הסבר למה זה רעיון רע.

גלילה לראש העמוד