跳转到主要内容
模块 9 · 第 1 课(共 4)课程中的33/57~10 min
模块课程(1/4)

高级数据类型和 ENUM

在上一课中,我们看到了基本的 CREATE TABLE 命令。现在让我们探索 PostgreSQL 提供的一些高级数据类型,以便以更精确和安全的方式对我们的域进行建模。

数字和文本类型

PostgreSQL 有多种数字和文本类型。选择正确的产品有助于验证和存储空间。

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 与 VARCHAR(n):在 Postgres 中性能是相同的。仅当您想要在数据库级别显式限制插入长度时,才使用 VARCHAR(n) 。
  • NUMERIC(10, 2):非常适合金钱或算术精度。这里最多允许8位整数和2位小数(总共10位)。如果插入 10.555,Postgres 将其舍入为 10.56。

UUID 类型

对于在网络上公开的安全标识符(例如 URL 中的公共 ID),UUID 通常优于经典的 SERIAL 增量。

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

ENUM(枚举)

通常,一列必须仅包含几个预定义值之一(例如订单状态:“新”、“已付款”、“已发货”)。一种方法是使用 CHECK 关键字,但 PostgreSQL 提供自定义 ENUM 类型。

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

这保证了任何人都无法插入无效状态,从而保护了数据的一致性。

尝试一下

锻炼#sql.m9.l1.e1
尝试:0加载中...

创建一个“user_reviews”表,其中包含:id (SERIAL pk)、test_id(默认为 gen_random_uuid() 的 UUID)、分数(整数不为空)和内容(TEXT)。除了类型之外,其他字段都不需要显式约束。

正在加载编辑器...
显示提示

写入CREATE TABLE user_reviews(...),然后写入各个字段。记住逗号。

3 次尝试后可用的解决方案

复习练习

锻炼#sql.m9.l1.e2
尝试:0加载中...

首先创建 ENUM 类型“user_role”,其值为“admin”和“user”。然后使用 id (SERIAL pk) 和角色(刚刚创建的类型,NOT NULL)创建“enum_users”表。

正在加载编辑器...
显示提示

不要忘记 ;分隔两个语句(CREATE TYPE 和 CREATE TABLE)。

3 次尝试后可用的解决方案