PostgreSQL CREATE TABLE
CREATE TABLE table_name (
column_name data_type [column_constraint],
...
[table_constraint]
);
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
username TEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT now()
);
| 类型 | 字节 | 说明 |
|---|---|---|
| SMALLINT | 2 | 小整数 |
| INTEGER / INT | 4 | 常用 |
| BIGINT | 8 | 大数据量 |
id BIGSERIAL
PostgreSQL 10+(最佳实践)
id BIGINT GENERATED ALWAYS AS IDENTITY
或:
id BIGINT GENERATED BY DEFAULT AS IDENTITY
📌 区别:
- ALWAYS:不能手动插入
- BY DEFAULT:可手动覆盖
| 类型 | 场景 |
|---|---|
| VARCHAR(n) | 有明确长度限制 |
| TEXT | 长度未知(推荐) |
| CHAR(n) | 定长(不推荐) |
title VARCHAR(100) NOT NULL
content TEXT
TIMESTAMP -- 不带时区
TIMESTAMPTZ -- 带时区(推荐)
DATE
TIME
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
is_active BOOLEAN DEFAULT true
meta JSONB
username TEXT NOT NULL
created_at TIMESTAMPTZ DEFAULT now()
email TEXT UNIQUE
age INT CHECK (age >= 0)
role_id INT REFERENCES roles(id)
PRIMARY KEY (id)
UNIQUE (code, url)
FOREIGN KEY (user_id, role_id)
REFERENCES user_roles(user_id, role_id)
CREATE TABLE articles (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
datetime TIMESTAMPTZ NOT NULL,
code CHAR(6) NOT NULL,
source TEXT NOT NULL,
title VARCHAR(100) NOT NULL,
url TEXT NOT NULL,
CONSTRAINT uk_articles_code_url UNIQUE (code, url)
);
📌 表结构 ≠ 索引
建表后再建索引(推荐)
CREATE INDEX idx_articles_datetime ON articles (datetime);
CREATE INDEX idx_articles_code ON articles (code);
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE INDEX idx_articles_source_trgm
ON articles USING gin (source gin_trgm_ops);
CREATE INDEX idx_articles_title_trgm
ON articles USING gin (title gin_trgm_ops);
CREATE INDEX idx_articles_url_trgm
ON articles USING gin (url gin_trgm_ops);
CREATE TABLE IF NOT EXISTS logs (...);
CREATE TEMP TABLE tmp_result (...);
会话结束自动删除
CREATE UNLOGGED TABLE cache_data (...);
- ❌ 崩溃会丢数据
- ✅ 快
COMMENT ON TABLE articles IS '文章表';
COMMENT ON COLUMN articles.url IS '文章原始链接';
code CHAR(6) -- 会补空格
- 若有历史原因可以接受
- 否则优先 VARCHAR(6)
PostgreSQL 中:
VARCHAR 和 TEXT 性能无差别
日志 / 数据采集表:
TIMESTAMPTZ
CREATE TABLE xxx (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ,
...
);
CREATE TABLE 的关键不是“能建”,而是:
- 字段类型选对
- 约束设计清晰
- 索引独立规划
- 为未来查询模式服务