模块 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 次尝试后可用的解决方案