跳转到主要内容
模块 8 · 第 3 课(共 4)课程中的31/57~12 min
模块课程(3/4)

创建表和约束:DDL

到目前为止,您一直在处理已经存在的表(customers, orders...)。 DDL(“数据定义语言”)是指以下语句: 创建和修改架构本身:表、列、约束、 索引。

创建表:语法

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

示例:链接客户和产品的愿望清单:

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

让我们一点一点地分解它。

最常见的类型

类型它包含什么
INTEGER / INT整数 (-2.1B … +2.1B)
BIGINT大整数
NUMERIC(p, s)精确的小数 — 金钱、百分比
TEXT可变长度字符串
VARCHAR(n)最大长度为 n 的字符串
BOOLEANTRUE / FALSE / NULL
DATE仅限日期
TIMESTAMP日期 + 时间(无时区)
TIMESTAMPTZ日期 + 时间(带时区)
SERIALINTEGER 具有自动递增序列

约束条件

约束是 PostgreSQL 自动执行的规则:如果 INSERT/UPDATE 违反了它,操作失败。

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

约束可以在列上内联声明或作为表级声明 约束(字段下方)。复合 UNIQUE 的示例:

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

检查约束

CHECK 强制执行自定义规则:

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 必须 ≥ 0;如果有人尝试 INSERT … threshold = -5,它 因约束错误而失败。

删除和更改

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;

轮到你了

锻炼#sql.m8.l3.e1
尝试:0加载中...

创建一个包含以下列的愿望清单表:id (SERIAL PRIMARY KEY)、customer_id (INTEGER NOT NULL REFERENCEScustomers(id))、product_id (INTEGER NOT NULL REFERENCES products(id))、added_on (DATE NOT NULL with DEFAULT CURRENT_DATE)。在对(customer_id、product_id)上添加 UNIQUE 约束。

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

UNIQUE(customer_id,product_id)作为底层的表级约束。

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

复习练习

锻炼#sql.m8.l3.e2
尝试:0加载中...

向客户表添加 BOOLEAN、NOT NULL 类型的新闻通讯列,默认为 false。使用单个 ALTER TABLE 语句。

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

如果没有 DEFAULT,ALTER 将失败,因为行已存在并且新列不为 NULL。

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