Chuyển đến nội dung chính
Mô-đun 8 · Bài học 3 trong tổng số 431/57 trong khóa học~12 min
Bài học theo mô-đun (3/4)

Tạo bảng và ràng buộc: DDL

Cho đến nay bạn đang làm việc trên các bảng đã tồn tại (customers, orders…). DDL ("Ngôn ngữ định nghĩa dữ liệu") đề cập đến các tuyên bố tạo và sửa đổi lược đồ: bảng, cột, ràng buộc, chỉ số.

TẠO BẢNG: cú pháp

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

Ví dụ: danh sách mong muốn liên kết khách hàng và sản phẩm:

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

Hãy chia nhỏ nó ra từng mảnh một.

Các loại phổ biến nhất

LoạiNó chứa đựng những gì
INTEGER / INTCác số nguyên (-2.1B … +2.1B)
BIGINTSố nguyên lớn
NUMERIC(p, s)Số thập phân chính xác - tiền, tỷ lệ phần trăm
TEXTChuỗi có độ dài thay đổi
VARCHAR(n)Chuỗi có độ dài tối đa n
BOOLEANTRUE / FALSE / NULL
DATEChỉ ngày
TIMESTAMPNgày + giờ (không có múi giờ)
TIMESTAMPTZNgày + giờ với múi giờ
SERIALINTEGER với trình tự tăng tự động

Hạn chế

Ràng buộc là một quy tắc mà PostgreSQL thực thi một cách tự động: nếu một INSERT/UPDATE vi phạm, thao tác không thành công.

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

Các ràng buộc có thể được khai báo nội tuyến trên một cột hoặc dưới dạng cấp bảng các ràng buộc (bên dưới các trường). Ví dụ về tổ hợp UNIQUE:

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

KIỂM TRA ràng buộc

CHECK thực thi quy tắc tùy chỉnh:

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 phải ≥ 0; nếu ai đó thử INSERT … threshold = -5, điều đó thất bại với một lỗi hạn chế.

Đánh rơi và thay đổi

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;

Đến lượt bạn

tập thể dục#sql.m8.l3.e1
Nỗ lực: 0Đang tải…

Tạo bảng danh sách mong muốn với các cột sau: id (SERIAL PRIMARY KEY), customer_id (INTEGER NOT NULL REFERENCES khách hàng(id)), sản phẩm_id (INTEGER NOT NULL REFERENCES sản phẩm(id)), added_on (DATE NOT NULL với DEFAULT CURRENT_DATE). Thêm một ràng buộc ĐỘC ĐÁO trên cặp (customer_id, Product_id).

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

ĐỘC ĐÁO (custom_id, Product_id) làm ràng buộc cấp bảng ở dưới cùng.

Giải pháp khả dụng sau 3 lần thử

Xem lại bài tập

tập thể dục#sql.m8.l3.e2
Nỗ lực: 0Đang tải…

Thêm vào bảng khách hàng một cột bản tin thuộc loại BOOLEAN, KHÔNG phải NULL, với MẶC ĐỊNH là sai. Sử dụng một câu lệnh ALTER TABLE duy nhất.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Nếu không có DEFAULT, ALTER sẽ không thành công vì các hàng đã tồn tại và cột mới KHÔNG NULL.

Giải pháp khả dụng sau 3 lần thử