الانتقال إلى المحتوى الرئيسي
الوحدة 8 · الدرس 3 من 431/57 في الدورة~12 min
دروس الوحدة (3/4)

إنشاء الجداول والقيود: DDL

لقد كنت تعمل حتى الآن على الجداول الموجودة بالفعل (customers، محمي_INLINE_1...). تشير 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)
);

دعونا نقسمها قطعة قطعة.

الأنواع الأكثر شيوعا

اكتبما يحمل
محمي_INLINE_2 / محمي_INLINE_3الأعداد الصحيحة (-2.1 ب… +2.1 ب)
محمي_INLINE_4أعداد صحيحة كبيرة
محمي_INLINE_5الكسور العشرية الدقيقة - المال والنسب المئوية
محمي_INLINE_6سلاسل متغيرة الطول
محمي_INLINE_7سلاسل يبلغ الحد الأقصى لطولها n
محمي_INLINE_9TRUE / FALSE / NULL
محمي_INLINE_13التاريخ فقط
محمي_INLINE_14التاريخ + الوقت (بدون منطقة زمنية)
محمي_INLINE_15التاريخ + الوقت مع المنطقة الزمنية
محمي_INLINE_16INTEGER بتسلسل متزايد تلقائيًا

قيود

القيد هو القاعدة التي يفرضها PostgreSQL تلقائيًا: إذا كان 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

يمكن إعلان القيود مضمنة في عمود أو **على مستوى الجدول القيود ** (أسفل الحقول). مثال على مركب 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جارٍ التحميل…

قم بإنشاء جدول قوائم الرغبات باستخدام الأعمدة التالية: المعرف (المفتاح الأساسي التسلسلي)، customer_id (عدد صحيح ليس مراجعًا فارغة للعملاء (معرف))، Product_id (عدد صحيح ليس مراجع فارغة منتجات (معرف))، add_on (تاريخ ليس فارغًا مع DEFAULT CURRENT_DATE). أضف قيدًا فريدًا على الزوج (customer_id، Product_id).

جارٍ تحميل المحرر…
إظهار التلميح

UNIQUE (customer_id، Product_id) كقيد على مستوى الجدول في الأسفل.

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#sql.m8.l3.e2
المحاولات: 0جارٍ التحميل…

أضف إلى جدول العملاء عمود رسالة إخبارية من النوع BOOLEAN، وليس NULL، مع القيمة DEFAULT false. استخدم عبارة ALTER TABLE واحدة.

جارٍ تحميل المحرر…
إظهار التلميح

بدون الإعداد الافتراضي، قد يفشل ALTER لأن الصفوف موجودة بالفعل والعمود الجديد ليس فارغًا.

الحل متاح بعد 3 من المحاولات