你想要了解 PostgreSQL 中创建表的完整 SQL 语法,包括基础创建、约束设置、字段类型、索引等核心用法,同时希望得到可直接复用的示例。

PostgreSQL 的 CREATE TABLE 语法功能丰富,支持多种字段类型、约束(主键、外键、唯一、非空等)、默认值、索引等,下面从基础到进阶拆解完整用法。

一、基础创建表语法

1. 核心语法结构
CREATE TABLE [IF NOT EXISTS] 表名 (
    字段名1 数据类型 [约束1] [约束2] ...,
    字段名2 数据类型 [约束] [DEFAULT 默认值],
    -- 表级约束(如主键、外键)
    [CONSTRAINT 约束名] 约束类型 (字段列表),
    -- 索引(可选)
    [INDEX 索引名 (字段名)]
);
  • IF NOT EXISTS:可选,避免表已存在时报错;
  • 数据类型:PostgreSQL 支持丰富类型(如 int4/int8varchar(n)texttimestampboolean 等);
  • 约束:常用 NOT NULLUNIQUEPRIMARY KEYFOREIGN KEYCHECK 等。
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;

四、关键知识点说明

  1. 自增字段

    • SERIAL:对应 int4(32位整数),自动创建序列;
    • BIGSERIAL:对应 int8(64位整数),适合数据量大的表;
    • PostgreSQL 10+ 也支持 IDENTITY 语法(兼容SQL标准):id INT4 GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
  2. 约束优先级

    • 字段级约束(如 NOT NULL)仅作用于单个字段;
    • 表级约束(如外键、复合主键)作用于多个字段,例如:PRIMARY KEY (user_id, order_no)(复合主键)。
  3. 数据类型选择

    • 字符串:短文本用 varchar(n),长文本用 text(无长度限制);
    • 数值:整数用 int4/int8,小数用 numeric(精度, 小数位)(避免浮点误差);
    • 时间:timestamp(带时区用 timestamptz)。

总结

  1. PostgreSQL 创建表的核心是 CREATE TABLE,通过 IF NOT EXISTS 避免重复创建;
  2. 常用约束包括 PRIMARY KEYNOT NULLUNIQUEFOREIGN KEYCHECK,需根据业务场景设置;
  3. 进阶用法支持自增字段(SERIAL/BIGSERIAL)、数组/JSON 类型、索引,可优化存储和查询;
  4. 外键约束需注意关联表的存在性,级联操作(ON DELETE CASCADE)需谨慎使用。

以上示例可直接在 PostgreSQL 中执行,适配大多数业务场景的表创建需求。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐