Skip to content
GitHub

Postgresql table

数据类型代码描述
布尔型BOOLEANTRUE(‘true’, ‘t’, ‘yes’, ‘y’, ‘1’), FALSE(‘false’, ‘f’, ‘no’, ‘n’, ‘0’) 或 NULL
字符类型CHAR(50)固定长度的字符类型, 长度不足, 空格补齐, 超出将异常(不推荐)
字符类型VARCHAR(50)可变长度的字符类型,不补长度, 超出将异常(不带长度与 TEXT 相同)
字符类型TEXT变长度的字符类型, 存储任意长度的字符串
整数类型SMALLINT/INT22 字节有符号整数(-32768, 32767)
整数类型INTEGER/INT/INT44 字节有符号整数(-2147483648, 2147483647)
整数类型BIGINT/INT88 字节有符号整数(-9223372036854775808, 9223372036854775807)
浮点类型REAL/FLOAT4单精度浮点数(4 字节)
浮点类型DOUBLE PRECISION/FLOAT8双精度浮点数(8 字节)
浮点类型NUMERIC(p, s)高精度数字, p 表示数字总长度, s 表示小数位数
时间类型DATE日期(yyyy-mm-dd)
时间类型TIME一天中的某个时刻(HH:MM:SS.ssssss)
时间类型TIMESTAMP时间日期和时刻(YYYY-MM-DD HH:MI:SS[.ssssss])
时间类型INTERVAL时间间隔
时间类型TIMESTAMP带时区的时间日期和时刻
JSON 类型JSONJSON 格式的字符串
数组类型ARRAY数组
UUID 类型UUIDUUID
/* 创建表 */
CREATE TABLE [IF NOT EXISTS] table_name (
  column1 datatype(length) column_contraint,
  column2 datatype(length) column_contraint,
  column3 datatype(length) column_contraint,
  table_constraints
);

/* 创建表示例(create 是关键字不可作为表头) */
CREATE TABLE IF NOT EXISTS "students" (             /* IF NOT EXISTS 表存在则不创建 */
    "id" SERIAL NOT NULL PRIMARY KEY,               /* id 作为主键且不能为空 id 自增*/
    "name" VARCHAR(20) NOT NULL,                    /* name 最长为20字符且不能为空 */
    "age" INT,                                      /* age 可以为空 */
    "locked" BOOLEAN NOT NULL DEFAULT false,        /* locked 默认为 false 且不能为空 */
    "create_at" TIMESTAMP NOT NULL DEFAULT NOW(),   /* create_at 时间戳且不能为空 */
  CONSTRAINT unique_name UNIQUE ("name", "age")     /* 设置唯一约束 unique_name */
);

/* 查看所有表 */
\d
          List of relations
 Schema |   Name   | Type  |  Owner
--------+----------+-------+----------
 public | students | table | postgres

/* 查看指定的表详细信息 */
\d students
                         Table "public.students"
  Column   |            Type             | Collation | Nullable | Default
-----------+-----------------------------+-----------+----------+---------
 id        | integer                     |           | not null |
 name      | character varying(20)       |           | not null |
 age       | integer                     |           |          |
 locked    | boolean                     |           | not null | false
 create_at | timestamp without time zone |           | not null |
Indexes:
    "students_pkey" PRIMARY KEY, btree (id)

/* 删除表 */
DROP TABLE IF EXISTS students;

使用 PRIMARY KEY 为表创建主键

  • 一张表只能有一个主键, 表可以没有主键
  • 主键必须唯一, 可以由一个列或多个列共同组成
  • 主键列不允许为 NULL
/* 创建表, id 为主键 */
CREATE TABLE users (
  id INTEGER PRIMARY KEY,
  name VARCHAR(45),
);

/* 无主键的表, 添加主键 */
ALTER TABLE users ADD PRIMARY KEY (id);

/* 查看表结构 */
\d users
                      Table "public.users"
Column |         Type          | Collation | Nullable | Default
--------+-----------------------+-----------+----------+---------
id     | integer               |           | not null |
name   | character varying(45) |           |          |
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)

/* 删除主键 */
TABLE TABLE users DROP CONSTRAINT users_pkey;

设置主键为 SERIAL, UUID 自动生成主键

/* SERIAL 列自动生成连续递增整数 */
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(45)
);

/* 使用 UUID 作为主键 */
CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  name VARCHAR(45)
);

/* 多列组合主键 */
CREATE TABLE users (
  id SERIAL,
  name VARCHAR(45),
  PRIMARY KEY (id, name)
);

使用 NOT NULL 使列的值不能为空

/* id 列不能为空 */
CREATE TABLE users (
    id INT NOT NULL
);

/* 列添加 NOT NULL 约束(需将列所有值设为非空才能添加) */
ALTER TABLE users ALTER COLUMN id SET NOT NULL;

/* 列删除 NOT NULL 约束 */
ALTER TABLE users ALTER COLUMN id DROP NOT NULL;

使用 UNIQUE 使列的值唯一

/* id 列所有值均唯一 */
CREATE TABLE users (
    id INT UNIQUE
);

/* 添加多列唯一约束 */
CREATE TABLE users (
    id INT,
    name VARCHAR(20),
    CONSTRAINT unique_cols
      UNIQUE (id, name)
);

/* 列添加 UNIQUE 约束(需将列所有值设为非空才能添加) */
ALTER TABLE users ADD CONSTRAINT unique_cols UNIQUE (id);

/* 列删除 UNIQUE 约束 */
ALTER TABLE users DROP CONSTRAINT unique_cols;

使用 CHECK 约束限制列的值范围, 不符合的数据无法添加

/* age 列添加 CHECK 约束 */
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    age INTEGER NOT NULL,
    CONSTRAINT user_age
      CHECK(age > 0)
);

/* 添加 CHECK 约束 */
ALTER TABLE users ADD CONSTRAINT user_age CHECK (age > 0);

/* 删除 CHECK 约束 */
ALTER TABLE users DROP CONSTRAINT user_age;
ALTER TABLE [IF EXISTS] "table_name"
    /* 重命名表 * */
    RENAME TO new_table_name;
    /* 添加列 */
    ADD COLUMN column_name datatype(length) column_contraint;
    /* 修改列 */
    ALTER COLUMN column_name datatype(length) column_contraint;
    /* 删除列 */
    DROP COLUMN column_name;
    /* 添加约束 */
    ADD CONSTRAINT constraint_name constraint_type;

注意: ALTER TABLE 每次只执行一个修改操作

/* 创建表 */
CREATE TABLE IF NOT EXISTS "job" (
    "id" SERIAL PRIMARY KEY,
    "name" VARCHAR(10) NOT NULL
);

/* 添加列 */
ALTER TABLE "job"
ADD COLUMN "status_name" VARCHAR(20) DEFAULT 'pending';

/* 重命名列 */
ALTER TABLE "job"
RENAME COLUMN "status_name" TO "status";

/* 删除列 */
ALTER TABLE "job"
DROP COLUMN "status";

/* 添加约束 */
ALTER TABLE "job"
ADD CONSTRAINT "unique_task" UNIQUE ("name");

/* 修改列 */
ALTER TABLE "job"
ALTER COLUMN "name" TYPE VARCHAR(50);

/* 重命名表 */
ALTER TABLE "job"
RENAME TO "task";