模块 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 的字符串 |
BOOLEAN | TRUE / FALSE / NULL |
DATE | 仅限日期 |
TIMESTAMP | 日期 + 时间(无时区) |
TIMESTAMPTZ | 日期 + 时间(带时区) |
SERIAL | INTEGER 具有自动递增序列 |
约束条件
约束是 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 次尝试后可用的解决方案