• בלוג
  • סדרת SQL בסיסי - פוסט 5 - הכנסת מידע

סדרת SQL בסיסי - פוסט 5 - הכנסת מידע

14/08/2024

1. יצירת טבלה חדשה

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

CREATE TABLE space_missions (
    id SMALLINT PRIMARY KEY,
    mission_name VARCHAR(200),
    crew_size SMALLINT,
    tagline VARCHAR(500)
);

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

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

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

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

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

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

2. הכנסת נתונים

הדביקו את הפקודות הבאות כבלוק אחד לתיבת ה SQL ב SQLime אחרי יצירת הטבלה והריצו:

INSERT INTO space_missions (id, mission_name, crew_size, tagline)
VALUES (1, 'Apollo 11', 3, 'One small step for man, one giant leap for mankind');

INSERT INTO space_missions (id, mission_name, crew_size, tagline)
VALUES (2, 'SpaceX Crew-1', 4, 'A new era of human spaceflight');

INSERT INTO space_missions (id, mission_name, crew_size, tagline)
VALUES (3, 'Mars 2020', 0, 'Seeking signs of ancient life and collecting rock and soil samples');

הפקודות הן פקודות הכנסת נתונים. הפורמט הוא:

  1. מתחילים במילים INSERT INTO ואחריהן שם הטבלה אליה רוצים לכתוב נתונים.

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

  3. אחרי הסוגריים נכתוב את המילה VALUES ואחריה עוד זוג סוגריים ובתוכם הערכים. יש לרשום את הערכים באותו סדר בו רשמנו את שמות העמודות.

3. הכנסת מספר שורות בפקודה אחת

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

INSERT INTO space_missions (id, mission_name, crew_size, tagline)
VALUES 
    (4, 'Artemis III', 4, 'Returning humans to the Moon'),
    (5, 'ExoMars', 0, 'Searching for signs of past life on Mars'),
    (6, 'Voyager 3', 0, 'Exploring the outer Solar System and beyond');

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

4. קריאת הנתונים שהכנסנו

בואו נוודא שההכנסה הצליחה. הפעילו את הפקודה:

SELECT * FROM space_missions;

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

5. בואו נבעט בזה קצת

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

INSERT INTO space_missions (id, mission_name, crew_size, tagline)
VALUES (1, 'Mars 2020', 0, 'Seeking signs of ancient life and collecting rock and soil samples');

בפקודה זו אני מנסה להכניס שורה נוספת שה id שלה הוא 1. בסיס הנתונים עונה לי בהודעת השגיאה:

SQLite3Error: SQLITE_CONSTRAINT_PRIMARYKEY: sqlite3 result code 1555: UNIQUE constraint failed: space_missions.id

למדנו ש id הוא מזהה ייחודי של שורה, ולכן לא ניתן להכניס לטבלה שתי שורות עם אותו ערך של id. עמודת id מוגדרת בתור מזהה ייחודי לשורה בגלל שביצירת הטבלה כתבתי את המילים PRIMARY KEY אחרי שם העמודה.

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

INSERT INTO space_missions (crew_size)
VALUES (50);

אני מפעיל פקודת SELECT כדי לבדוק מה קיבלתי:

SELECT * FROM space_missions;

ושימו לב לשורה האחרונה ברשימת התוצאות:

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

  2. העמודות mission_name ו tagline נשארו ריקות. באופן כללי ביצירת הטבלה לא הגדרתי שום מגבלה על עמודות אלה ולכן לבסיס הנתונים אין בעיה להשאיר אותן בלי ערך. בשיעור הבא נלמד יותר על סוגי המידע ונראה גם איך מגדירים מגבלות על עמודות מסוימות.

הודעת שגיאה אחרונה שאנחנו עשויים לפגוש תגיע מהפעלת הפקודה:

INSERT INTO space_missions (mission_name, crew_size, tagline)
VALUES ("Mars 2020", 0, 'Seeking signs of ancient life and collecting rock and soil samples');

שימו לב שוויתרתי על ה id, אבל את שם המשימה כתבתי בתוך מרכאות כפולות ולא בתוך גרש בודד. תגובת בסיס הנתונים:

SQLite3Error: SQLITE_ERROR: sqlite3 result code 1: no such column: Mars 2020

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

מה לגבי טעויות בסוגי הנתונים? בבסיס נתונים SQLite אפשר להכניס מחרוזות לעמודות של מספרים ולהיפך (נסו את זה). רוב בסיסי הנתונים לא יאפשרו לכם לשמור מידע מספרי בעמודה מסוג טקסט או מידע טקסטואלי בעמודת מספרים.