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

Các kiểu dữ liệu nâng cao và ENUM

Trong bài học trước chúng ta đã biết lệnh CREATE TABLE cơ bản. Bây giờ chúng ta hãy khám phá một số loại dữ liệu nâng cao mà PostgreSQL cung cấp để lập mô hình miền của chúng ta theo cách chính xác và an toàn hơn.

Các loại số và văn bản

PostgreSQL có một số loại cho số và văn bản. Việc chọn đúng sẽ giúp ích cho cả quá trình xác thực và dung lượng lưu trữ.

SQL
CREATE TABLE advanced_products (
  id           SERIAL PRIMARY KEY,
  name         VARCHAR(50) NOT NULL,
  description  TEXT,
  -- NUMERIC(p,s) dove p = cifre totali, s = cifre decimali
  price        NUMERIC(10, 2) NOT NULL,
  featured     BOOLEAN DEFAULT FALSE
);
  • TEXT vs VARCHAR(n): Trong Postgres hiệu suất là giống hệt nhau. Bạn chỉ sử dụng VARCHAR(n) khi bạn muốn giới hạn rõ ràng độ dài được chèn ở cấp cơ sở dữ liệu.
  • NUMERIC(10, 2): Hoàn hảo về tiền bạc hoặc độ chính xác số học. Ở đây nó cho phép tối đa 8 chữ số nguyên và 2 số thập phân (tổng cộng là 10). Nếu bạn chèn 10.555, Postgres sẽ làm tròn nó thành 10.56.

Loại UUID

Đối với số nhận dạng an toàn hiển thị trên web (chẳng hạn như ID công khai trong URL), UUID thường được ưu tiên hơn mức tăng SERIAL cổ điển.

SQL
CREATE TABLE public_orders (
  id          UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  customer    TEXT NOT NULL,
  total       NUMERIC(10, 2)
);

ENUM (Đếm)

Thông thường, một cột chỉ được chứa một trong số ít giá trị được xác định trước (ví dụ: trạng thái đơn hàng: "mới", "đã thanh toán", "đã giao hàng"). Một cách tiếp cận là sử dụng từ khóa CHECK, nhưng PostgreSQL cung cấp các loại ENUM tùy chỉnh.

SQL
-- Dobbiamo prima creare il tipo:
CREATE TYPE order_status AS ENUM ('nuovo', 'pagato', 'spedito', 'cancellato');

-- Ora possiamo usarlo in una tabella:
CREATE TABLE orders_demo (
  id SERIAL PRIMARY KEY,
  status order_status NOT NULL DEFAULT 'nuovo'
);

Điều này đảm bảo rằng không ai có thể chèn trạng thái không hợp lệ, bảo vệ tính nhất quán của dữ liệu.

Hãy thử nó

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

Tạo bảng 'user_reviews' với: id (SERIAL pk), test_id (UUID với gen_random_uuid() mặc định), điểm (số nguyên không phải null) và nội dung (TEXT). Không có trường nào khác cần các ràng buộc rõ ràng ngoài loại.

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

Viết TẠO BẢNG user_reviews (...) và sau đó là các trường khác nhau. Hãy nhớ dấu phẩy.

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.m9.l1.e2
Nỗ lực: 0Đang tải…

Trước tiên hãy tạo loại ENUM 'user_role' với các giá trị 'admin' và 'user'. Sau đó tạo bảng 'enum_users' với id (SERIAL pk) và vai trò (loại bạn vừa tạo, KHÔNG phải NULL).

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

Đừng quên ; để phân tách hai câu lệnh (CREATE TYPE và CREATE TABLE).

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