שיעורי מודול (3/4)
יצירת טבלאות ואילוצים: DDL
עד כה עבדת על טבלאות שכבר קיימות (customers,
orders...). DDL ("שפת הגדרת נתונים") מתייחס להצהרות ש
צור ושנה את הסכימה עצמה: טבלאות, עמודות, אילוצים,
אינדקסים.
צור טבלה: התחביר
CREATE TABLE nome_tabella (
colonna TIPO [vincoli_colonna],
…,
[vincoli_tabella]
);דוגמה: רשימת משאלות המקשרת בין לקוחות ומוצרים:
CREATE TABLE wishlists (
id SERIAL PRIMARY KEY,
customer_id INTEGER NOT NULL REFERENCES customers(id),
product_id INTEGER NOT NULL REFERENCES products(id),
added_on DATE NOT NULL DEFAULT CURRENT_DATE,
note TEXT,
UNIQUE (customer_id, product_id)
);בואו נפרק את זה חלק אחר חלק.
הסוגים הנפוצים ביותר
| הקלד | מה זה מכיל |
|---|---|
INTEGER / INT | מספרים שלמים (-2.1B … +2.1B) |
BIGINT | מספרים שלמים גדולים |
NUMERIC(p, s) | עשרוניות מדויקות - כסף, אחוזים |
TEXT | מחרוזות באורך משתנה |
VARCHAR(n) | מחרוזות באורך מרבי של n |
BOOLEAN | TRUE / FALSE / NULL |
DATE | תאריך בלבד |
TIMESTAMP | תאריך + שעה (ללא אזור זמן) |
TIMESTAMPTZ | תאריך + זמן עם אזור זמן |
SERIAL | INTEGER עם רצף הגדלה אוטומטית |
אילוצים
אילוץ הוא כלל ש-PostgreSQL אוכף באופן אוטומטי: אם an
INSERT/UPDATE מפר אותו, הפעולה נכשלת.
PRIMARY KEY -- identifica univocamente la riga, non NULL
NOT NULL -- vieta NULL
UNIQUE -- vieta duplicati su questa colonna
REFERENCES tabella(colonna) -- foreign key
CHECK (espressione_booleana) -- es. CHECK (price > 0)
DEFAULT espressione -- valore di default se non fornitoניתן להכריז על אילוצים inline בעמודה או כרמת טבלה
אילוצים (מתחת לשדות). דוגמה של UNIQUE מורכב:
UNIQUE (customer_id, product_id) -- niente coppia (cliente, prodotto) duplicataאילוץ בדוק
CHECK אוכף כלל מותאם אישית:
CREATE TABLE stock_alerts (
product_id INTEGER PRIMARY KEY REFERENCES products(id),
threshold INTEGER NOT NULL CHECK (threshold >= 0),
notify_email TEXT NOT NULL,
active BOOLEAN NOT NULL DEFAULT true
);threshold חייב להיות ≥ 0; אם מישהו מנסה INSERT … threshold = -5, זה
נכשל עם שגיאת אילוץ.
ירידה ושינוי
DROP TABLE wishlists; -- elimina la tabella (e i dati!)
DROP TABLE IF EXISTS wishlists; -- senza errore se non esiste
ALTER TABLE customers ADD COLUMN newsletter BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE customers DROP COLUMN newsletter;התור שלך
צור טבלת רשימות משאלות עם העמודות הבאות: id (מפתח PRIMARY SERIAL), customer_id (INTEGER NOT NULL REFERENCES customers(id)), product_id (INTEGER NOT NULL REFERENCES products(id)), added_on (DATE NOT NULL עם DEFAULT CURRENT_DATE). הוסף אילוץ ייחודי על הזוג (מזהה_לקוח, מזהה_מוצר).
הצג רמז
UNIQUE (מזהה_לקוח, מזהה_מוצר) כאילוץ ברמת הטבלה בתחתית.
הפתרון זמין לאחר 3 ניסיונות
סקירת התרגיל
הוסף לטבלת הלקוחות עמודת ניוזלטר מסוג BOOLEAN, NOT NULL, עם DEFAULT false. השתמש במשפט ALTER TABLE יחיד.
הצג רמז
ללא DEFAULT, ה-ALTER ייכשל מכיוון ששורות כבר קיימות והעמודה החדשה היא NOT NULL.
הפתרון זמין לאחר 3 ניסיונות