דילוג לתוכן המרכזי
מודול 8 · שיעור 3 מתוך 431/57 בקורס~12 min
שיעורי מודול (3/4)

יצירת טבלאות ואילוצים: DDL

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

צור טבלה: התחביר

SQL
CREATE TABLE nome_tabella (
  colonna  TIPO  [vincoli_colonna],
  …,
  [vincoli_tabella]
);

דוגמה: רשימת משאלות המקשרת בין לקוחות ומוצרים:

SQL
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
BOOLEANTRUE / FALSE / NULL
DATEתאריך בלבד
TIMESTAMPתאריך + שעה (ללא אזור זמן)
TIMESTAMPTZתאריך + זמן עם אזור זמן
SERIALINTEGER עם רצף הגדלה אוטומטית

אילוצים

אילוץ הוא כלל ש-PostgreSQL אוכף באופן אוטומטי: אם an INSERT/UPDATE מפר אותו, הפעולה נכשלת.

SQL
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 מורכב:

SQL
UNIQUE (customer_id, product_id)   -- niente coppia (cliente, prodotto) duplicata

אילוץ בדוק

CHECK אוכף כלל מותאם אישית:

SQL
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, זה נכשל עם שגיאת אילוץ.

ירידה ושינוי

SQL
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;

התור שלך

פעילות גופנית#sql.m8.l3.e1
ניסיונות: 0טוען...

צור טבלת רשימות משאלות עם העמודות הבאות: 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 ניסיונות

סקירת התרגיל

פעילות גופנית#sql.m8.l3.e2
ניסיונות: 0טוען...

הוסף לטבלת הלקוחות עמודת ניוזלטר מסוג BOOLEAN, NOT NULL, עם DEFAULT false. השתמש במשפט ALTER TABLE יחיד.

טוען עורך...
הצג רמז

ללא DEFAULT, ה-ALTER ייכשל מכיוון ששורות כבר קיימות והעמודה החדשה היא NOT NULL.

הפתרון זמין לאחר 3 ניסיונות