PostgreSQL 创建表格 (CREATE TABLE)
在 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
);
解释
| 列名 | 数据类型 | 约束 |
|---|---|---|
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)(限制必须大于0) |
hire_date | DATE | DEFAULT 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_id是PRIMARY 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用于删除表。
更多详细内容请关注其他相关文章!