סדרת SQL בסיסי - פוסט 6 - סוגי מידע

15/08/2024

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

1. סוגי מידע יחסית בטוחים לשימוש (ואיפה לומדים יותר)

באתר:

https://sqliteonline.com

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

אלה סוגי המידע בהם יחסית בטוח להשתמש. ב SQL אין חשיבות לאותיות קטנות או גדולות:

  1. מספר שלם INTEGER (נקרא גם INT). סוג מידע Integer נועד לעמודה שמחזיקה מספר שלם כמו 2, 10 או 50. הערך בעמודה הוא בין -2,147,483,648 ל 2,147,483,647.

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

  3. תאריך DATE. סוג מידע שנועד לשמור תאריך (מידע זה לא כולל זמן. בסיסי נתונים שונים כוללים הגדרות יותר ספציפיות כמו TIMESTAMP או DATETIME כדי להוסיף את הזמן).

  4. מספר עם נקודה עשרונית FLOAT. שומר ערכים עם שבר למשל 2.5.

  5. טקסט TEXT. שומר טקסטים ללא הגבלת אורך.

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

https://sqliteonline.com

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

CREATE TABLE coffee_orders (
    order_id SERIAL PRIMARY KEY,
    customer_name TEXT,
    coffee_typ

INSERT INTO coffee_orders (customer_name, coffee_type, price, order_timestamp)
VALUES 
    ('Alice Johnson', 'Caramel Macchiato', 4.75, '2024-02-10 08:30:00+00'),
    ('Bob Smith', 'Espresso Double Shot', 3.25, '2024-02-10 09:15:00+00'),
    ('Charlie Brown', 'Pumpkin Spice Latte', 5.50, '2024-02-10 10:00:00+00');

עכשיו בואו נראה מה קורה כשאני מנסה להוסיף לבסיס נתונים שורה שלא מתאימה לסוגי המידע שהגדרתי:

INSERT INTO coffee_orders (customer_name, coffee_type, price, order_timestamp)
VALUES (8, 'Caramel Macchiato', 4.75, '2024-02-10 08:30:00+00')

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

INSERT INTO coffee_orders (customer_name, coffee_type, price, order_timestamp)
VALUES (8, 'Caramel Macchiato', 'expensive', '2024-02-10 08:30:00+00')

הפעם כבר קיבלתי שגיאה:

 Error 22P02 invalid input syntax for type double precision: "expensive"

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

2. הגדרות נוספות לעמודות

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

  1. ההגדרה NOT NULL אחרי סוג המידע אומרת שבכל הכנסה חייבים להעביר ערך לעמודה זו.

  2. ההגדרה UNIQUE אומרת שהערך בעמודה זו חייב להיות ייחודי לכל שורה.

  3. ההגדרה DEFAULT מגדירה ערך ברירת מחדל לעמודה.

בואו נראה דוגמה הפעם חזרה ל SQLite. אני יוצר את הטבלה:

CREATE TABLE MythicalCreatures (
    creature_id INTEGER PRIMARY KEY,      -- Primary key
    name TEXT NOT NULL,                   -- Creature name, cannot be NULL
    magical_power_level INTEGER DEFAULT 50, -- Default power level
    habitat TEXT UNIQUE                    -- Unique habitat for each creature
);

INSERT INTO MythicalCreatures (creature_id, name, magical_power_level, habitat)
VALUES (1, 'Phoenix', 100, 'Volcanic Peaks');
INSERT INTO MythicalCreatures (creature_id, name, habitat)
VALUES (2, 'Dragon', 'Mystic Mountains');
INSERT INTO MythicalCreatures (creature_id, name, magical_power_level, habitat)
VALUES (3, 'Unicorn', 70, 'Enchanted Forest');
INSERT INTO MythicalCreatures (creature_id, name, habitat)
VALUES (4, 'Mermaid', 'Coral Reefs');

3. עכשיו אתם

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

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

  3. נסו להכניס שורה שלא כוללת שם ליצור. מה הודעת השגיאה שקיבלתם?

  4. הכניסו שורה עם ערך ריק לשדה habitat. ועוד אחת. ועוד אחד. שימו לב שלמרות שהגדרנו את העמודה בתור "ייחודית", אין בעיה שיהיו ערכים ריקים ואף יותר משורה אחת עם ערך ריק.