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
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:
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ại | Nó chứa đựng những gì |
|---|---|
INTEGER / INT | Các số nguyên (-2.1B … +2.1B) |
BIGINT | Số nguyên lớn |
NUMERIC(p, s) | Số thập phân chính xác - tiền, tỷ lệ phần trăm |
TEXT | Chuỗi có độ dài thay đổi |
VARCHAR(n) | Chuỗi có độ dài tối đa n |
BOOLEAN | TRUE / FALSE / NULL |
DATE | Chỉ ngày |
TIMESTAMP | Ngày + giờ (không có múi giờ) |
TIMESTAMPTZ | Ngày + giờ với múi giờ |
SERIAL | INTEGER 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.
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 fornitoCá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:
UNIQUE (customer_id, product_id) -- niente coppia (cliente, prodotto) duplicataKIỂM TRA ràng buộc
CHECK thực thi quy tắc tùy chỉnh:
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
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ạ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).
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
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.
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ử