豆包 PostgreSQL.17 创建表SQL
·
你想要了解 PostgreSQL 中创建表的完整 SQL 语法,包括基础创建、约束设置、字段类型、索引等核心用法,同时希望得到可直接复用的示例。
PostgreSQL 的 CREATE TABLE 语法功能丰富,支持多种字段类型、约束(主键、外键、唯一、非空等)、默认值、索引等,下面从基础到进阶拆解完整用法。
一、基础创建表语法
1. 核心语法结构
CREATE TABLE [IF NOT EXISTS] 表名 (
字段名1 数据类型 [约束1] [约束2] ...,
字段名2 数据类型 [约束] [DEFAULT 默认值],
-- 表级约束(如主键、外键)
[CONSTRAINT 约束名] 约束类型 (字段列表),
-- 索引(可选)
[INDEX 索引名 (字段名)]
);
IF NOT EXISTS:可选,避免表已存在时报错;- 数据类型:PostgreSQL 支持丰富类型(如
int4/int8、varchar(n)、text、timestamp、boolean等); - 约束:常用
NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK等。
2. 基础示例(用户表)
-- 创建用户表,包含基础字段和约束
CREATE TABLE IF NOT EXISTS "user" (
id SERIAL PRIMARY KEY, -- SERIAL 自增整数(PostgreSQL 特有),主键
username VARCHAR(50) NOT NULL UNIQUE, -- 用户名,非空且唯一
password VARCHAR(100) NOT NULL, -- 密码,非空
email VARCHAR(100) UNIQUE, -- 邮箱,唯一(可空)
age SMALLINT CHECK (age >= 0 AND age <= 150), -- 年龄,范围校验
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间,默认当前时间
is_active BOOLEAN DEFAULT TRUE -- 是否激活,默认true
);
二、进阶用法(含外键、索引、特殊类型)
1. 带外键的表(订单表,关联用户表)
-- 创建订单表,外键关联用户表id
CREATE TABLE IF NOT EXISTS "order" (
order_id BIGSERIAL PRIMARY KEY, -- BIGSERIAL 大整数自增
user_id INT4 NOT NULL,
order_no VARCHAR(64) NOT NULL UNIQUE, -- 订单号,唯一
amount NUMERIC(10,2) NOT NULL, -- 金额,精确小数(10位整数+2位小数)
status SMALLINT NOT NULL DEFAULT 0, -- 订单状态:0-待支付,1-已支付,2-已取消
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- 外键约束:user_id 关联 user.id,级联删除(用户删除则订单也删除)
CONSTRAINT fk_order_user FOREIGN KEY (user_id)
REFERENCES "user"(id) ON DELETE CASCADE
);
2. 带索引的表(优化查询)
-- 为订单表的user_id和create_time创建联合索引(优化按用户+时间查询)
CREATE INDEX idx_order_user_create ON "order"(user_id, create_time);
-- 也可在创建表时直接定义索引
CREATE TABLE IF NOT EXISTS product (
id SERIAL PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
category_id INT4 NOT NULL,
price NUMERIC(8,2) NOT NULL,
-- 表内直接创建索引
INDEX idx_product_category (category_id)
);
3. 特殊类型示例(数组、JSON)
PostgreSQL 支持数组、JSON 等非关系型类型,适合存储复杂数据:
CREATE TABLE IF NOT EXISTS article (
id SERIAL PRIMARY KEY,
title VARCHAR(200) NOT NULL,
tags TEXT[], -- 标签数组,如 ['Java', 'PostgreSQL']
content TEXT,
metadata JSONB, -- JSONB 类型(可索引,推荐),存储扩展信息
publish_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 插入数组/JSON数据示例
INSERT INTO article (title, tags, metadata)
VALUES (
'PostgreSQL创建表',
ARRAY['PostgreSQL', 'SQL'],
'{"author": "张三", "read_count": 100}'::JSONB
);
三、常用补充语法
1. 创建临时表(会话结束后自动删除)
-- 临时表,仅当前会话有效
CREATE TEMP TABLE temp_order (
id INT4,
order_no VARCHAR(64)
);
2. 复制表结构(不含数据)
-- 复制user表的结构,但不复制数据和索引
CREATE TABLE user_copy LIKE "user" WITHOUT DATA;
3. 删除表(慎用)
-- 删除表(若存在),级联删除依赖该表的对象(如外键)
DROP TABLE IF EXISTS "order" CASCADE;
四、关键知识点说明
-
自增字段:
SERIAL:对应int4(32位整数),自动创建序列;BIGSERIAL:对应int8(64位整数),适合数据量大的表;- PostgreSQL 10+ 也支持
IDENTITY语法(兼容SQL标准):id INT4 GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY。
-
约束优先级:
- 字段级约束(如
NOT NULL)仅作用于单个字段; - 表级约束(如外键、复合主键)作用于多个字段,例如:
PRIMARY KEY (user_id, order_no)(复合主键)。
- 字段级约束(如
-
数据类型选择:
- 字符串:短文本用
varchar(n),长文本用text(无长度限制); - 数值:整数用
int4/int8,小数用numeric(精度, 小数位)(避免浮点误差); - 时间:
timestamp(带时区用timestamptz)。
- 字符串:短文本用
总结
- PostgreSQL 创建表的核心是
CREATE TABLE,通过IF NOT EXISTS避免重复创建; - 常用约束包括
PRIMARY KEY、NOT NULL、UNIQUE、FOREIGN KEY、CHECK,需根据业务场景设置; - 进阶用法支持自增字段(
SERIAL/BIGSERIAL)、数组/JSON 类型、索引,可优化存储和查询; - 外键约束需注意关联表的存在性,级联操作(
ON DELETE CASCADE)需谨慎使用。
以上示例可直接在 PostgreSQL 中执行,适配大多数业务场景的表创建需求。
更多推荐




所有评论(0)