PostgreSQL 创建表格 (CREATE TABLE)
                           
天天向上
发布: 2025-03-11 23:20:19

原创
856 人浏览过

在 PostgreSQL 中,CREATE TABLE 语句用于创建新的表格(关系),定义表的列及其数据类型、约束等。以下是完整的 CREATE TABLE 语法和详细解析。


1. 基本 CREATE TABLE 语法

CREATE TABLE table_name (
    column_name1 data_type constraints,
    column_name2 data_type constraints,
    ...
);
  • table_name:表名,必须唯一,不能与已有表名冲突。
  • column_name:列名,每个列代表一个字段。
  • data_type:列的数据类型,如 INTEGER, VARCHAR(255), BOOLEAN 等。
  • constraints:列约束(可选),如 PRIMARY KEY, NOT NULL, UNIQUE 等。

2. 创建一个基本表

创建一个名为 employees 的表:

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    salary NUMERIC(10,2) CHECK (salary > 0),
    hire_date DATE DEFAULT CURRENT_DATE
);

解释

列名数据类型约束
idSERIALPRIMARY KEY(自动递增主键)
first_nameVARCHAR(50)NOT NULL(不能为空)
last_nameVARCHAR(50)NOT NULL
emailVARCHAR(100)UNIQUE NOT NULL(唯一且不能为空)
salaryNUMERIC(10,2)CHECK (salary > 0)(限制必须大于0)
hire_dateDATEDEFAULT CURRENT_DATE(默认值为当前日期)

3. 常见数据类型

数据类型描述
INTEGER整数类型
SERIAL自动递增整数(用于主键)
VARCHAR(n)可变长度字符串,最多 n 个字符
TEXT长文本
BOOLEAN布尔值(TRUE / FALSE
DATE日期(YYYY-MM-DD)
TIMESTAMP日期时间(YYYY-MM-DD HH:MI:SS)
NUMERIC(p,s)定点数,p 为总位数,s 为小数位数

4. 约束(Constraints)

约束用于定义数据完整性,PostgreSQL 支持以下几种约束:

(1) PRIMARY KEY(主键)

  • 唯一标识每一行数据,不能重复且不能为空。
  • 例如:
  id SERIAL PRIMARY KEY
  • 或者:
  CREATE TABLE test (
      id INT,
      CONSTRAINT test_pk PRIMARY KEY (id)
  );

(2) NOT NULL(非空)

  • 确保列不能为空:
  email VARCHAR(100) NOT NULL

(3) UNIQUE(唯一约束)

  • 确保列值不重复:
  email VARCHAR(100) UNIQUE

(4) CHECK(检查约束)

  • 限制值的范围:
  salary NUMERIC(10,2) CHECK (salary > 0)

(5) DEFAULT(默认值)

  • 如果未指定值,使用默认值:
  hire_date DATE DEFAULT CURRENT_DATE

(6) FOREIGN KEY(外键)

  • 确保列的值来自另一个表:
  CREATE TABLE departments (
      dept_id SERIAL PRIMARY KEY,
      dept_name VARCHAR(100) NOT NULL
  );

  CREATE TABLE employees (
      id SERIAL PRIMARY KEY,
      first_name VARCHAR(50) NOT NULL,
      dept_id INT REFERENCES departments(dept_id)
  );
  • 也可以显式命名:
  CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES departments(dept_id)

5. 复杂表创建示例

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT NOT NULL,
    order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    total_amount NUMERIC(10,2) CHECK (total_amount >= 0),
    status VARCHAR(20) DEFAULT 'Pending',
    CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE
);
  • order_idPRIMARY KEY,自动递增。
  • customer_id 不能为空,且为外键,引用 customers 表的 customer_id
  • order_date 默认为当前时间。
  • total_amount 不能小于 0。
  • status 默认值为 'Pending'
  • ON DELETE CASCADE:如果 customers 表中的客户被删除,其订单也会被删除。

6. 查看表结构

创建表后,可以使用 psql 查看表结构:

\d employees

或者:

SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_name = 'employees';

7. 删除表

如果需要删除表,可以使用:

DROP TABLE employees;

或者:

DROP TABLE IF EXISTS employees;

8. 修改表

(1) 添加新列

ALTER TABLE employees ADD COLUMN phone VARCHAR(15);

(2) 修改列数据类型

ALTER TABLE employees ALTER COLUMN salary TYPE NUMERIC(12,2);

(3) 删除列

ALTER TABLE employees DROP COLUMN phone;

(4) 添加约束

ALTER TABLE employees ADD CONSTRAINT unique_email UNIQUE (email);

9. 总结

  • 使用 CREATE TABLE 创建表,定义列名、数据类型和约束。
  • PRIMARY KEY 作为唯一标识,FOREIGN KEY 用于关联其他表。
  • NOT NULL, UNIQUE, CHECK 保障数据完整性。
  • DEFAULT 设置默认值,ON DELETE CASCADE 维护表关系。
  • ALTER TABLE 用于修改表结构,DROP TABLE 用于删除表。

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *