1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG013-PG简单数据操作:插入/更新/删除数据实操

本文详细介绍PostgreSQL数据库中基本的数据操作,包括数据的插入(INSERT)、更新(UPDATE)和删除(DELETE)操作,以及这些操作的语法、使用方法和实战案例。风哥教程参考PostgreSQL官方文档Data Manipulation部分。

本文档风哥主要介绍PostgreSQL教程013相关内容。风哥教程参考PostgreSQL官方文档Server Administration, SQL Language内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 数据操作语言(DML)概述

数据操作语言(DML)是用于操作数据库中数据的语言,主要包括INSERT、UPDATE和DELETE三个基本操作。这些操作用于向数据库表中插入新数据、更新现有数据和删除不需要的数据。学习交流加群风哥微信: itpux-com

1.2 事务概念

事务是数据库操作的基本单位,它包含一个或多个DML操作。事务具有ACID特性:

  • 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败回滚
  • 一致性(Consistency):事务执行前后,数据库状态保持一致
  • 隔离性(Isolation):多个事务并发执行时,彼此之间互不影响
  • 持久性(Durability):事务一旦提交,其结果将永久保存到数据库中
风哥教程针对风哥教程针对风哥教程针对生产环境建议:在执行DML操作时,应注意事务的使用,特别是在执行批量操作或相关操作时,使用事务可以确保数据的一致性和完整性。学习交流加群风哥QQ113257174

Part02-数据插入操作(INSERT)

2.1 基本插入语法

INSERT语句用于向数据库表中插入新的记录。

— 创建示例表
CREATE TABLE fgedu_products (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
category VARCHAR(50) NOT NULL,
price NUMERIC(10, 2) NOT NULL,
stock_quantity INTEGER DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

— 基本插入语法
INSERT INTO fgedu_products (product_name, category, price, stock_quantity)
VALUES (‘PostgreSQL数据库实战’, ‘计算机图书’, 89.90, 100);

— 查询插入结果
SELECT * FROM fgedu_products;
product_id | product_name | category | price | stock_quantity | created_at
————+———————-+————+——-+—————-+——————————-
1 | PostgreSQL数据库实战 | 计算机图书 | 89.90 | 100 | 2026-04-02 18:00:00.123456+08
(1 row)

2.2 插入多条记录

可以使用一条INSERT语句插入多条记录。

— 插入多条记录
INSERT INTO fgedu_products (product_name, category, price, stock_quantity)
VALUES
(‘Python编程基础’, ‘计算机图书’, 59.90, 200),
(‘Java核心技术’, ‘计算机图书’, 139.90, 150),
(‘数据结构与算法’, ‘计算机图书’, 79.90, 80),
(‘机器学习实战’, ‘人工智能’, 99.90, 60);

— 查询插入结果
SELECT * FROM fgedu_products;
product_id | product_name | category | price | stock_quantity | created_at
————+———————-+————+——-+—————-+——————————-
1 | PostgreSQL数据库实战 | 计算机图书 | 89.90 | 100 | 2026-04-02 18:00:00.123456+08
2 | Python编程基础 | 计算机图书 | 59.90 | 200 | 2026-04-02 18:05:00.123456+08
3 | Java核心技术 | 计算机图书 | 139.90 | 150 | 2026-04-02 18:05:00.123456+08
4 | 数据结构与算法 | 计算机图书 | 79.90 | 80 | 2026-04-02 18:05:00.123456+08
5 | 机器学习实战 | 人工智能 | 99.90 | 60 | 2026-04-02 18:05:00.123456+08
(5 rows)

2.3 使用默认值插入

可以使用DEFAULT关键字插入默认值,或者省略某些字段让数据库自动使用默认值。

— 使用DEFAULT关键字插入默认值
INSERT INTO fgedu_products (product_name, category, price, stock_quantity, created_at)
VALUES (‘深度学习入门’, ‘人工智能’, 129.90, DEFAULT, DEFAULT);

— 省略某些字段,使用默认值
INSERT INTO fgedu_products (product_name, category, price)
VALUES (‘大数据处理’, ‘大数据’, 119.90);

— 查询插入结果
SELECT * FROM fgedu_products WHERE product_id >= 6;
product_id | product_name | category | price | stock_quantity | created_at
————+—————-+———-+——–+—————-+——————————-
6 | 深度学习入门 | 人工智能 | 129.90 | 0 | 2026-04-02 18:10:00.123456+08
7 | 大数据处理 | 大数据 | 119.90 | 0 | 2026-04-02 18:10:00.123456+08
(2 rows)

2.4 从查询结果插入

可以使用INSERT INTO … SELECT语句从其他表或查询结果中插入数据。

— 创建一个临时表用于存储促销商品
CREATE TABLE fgedu_promotion_products (
promotion_id SERIAL PRIMARY KEY,
product_id INTEGER NOT NULL,
product_name VARCHAR(100) NOT NULL,
original_price NUMERIC(10, 2) NOT NULL,
promotion_price NUMERIC(10, 2) NOT NULL,
promotion_start_date DATE NOT NULL,
promotion_end_date DATE NOT NULL
);

— 从fgedu_products表中选择部分商品插入到促销表
INSERT INTO fgedu_promotion_products (
product_id, product_name, original_price, promotion_price,
promotion_start_date, promotion_end_date
)
SELECT
product_id, product_name, price, price * 0.8,
CURRENT_DATE, CURRENT_DATE + INTERVAL ‘7 days’
FROM fgedu_products
WHERE category = ‘计算机图书’;

— 查询插入结果
SELECT * FROM fgedu_promotion_products;
promotion_id | product_id | product_name | original_price | promotion_price | promotion_start_date | promotion_end_date
————–+————+———————-+—————-+—————–+———————-+——————–
1 | 1 | PostgreSQL数据库实战 | 89.9 | 71.92 | 2026-04-02 | 2026-04-09
2 | 2 | Python编程基础 | 59.9 | 47.92 | 2026-04-02 | 2026-04-09
3 | 3 | Java核心技术 | 139.9 | 111.92 | 2026-04-02 | 2026-04-09
4 | 4 | 数据结构与算法 | 79.9 | 63.92 | 2026-04-02 | 2026-04-09
(4 rows)

Part03-数据更新操作(UPDATE)

3.1 基本更新语法

UPDATE语句用于更新数据库表中的现有记录。

— 更新单条记录
UPDATE fgedu_products
SET price = 99.90
WHERE product_id = 1;

— 查询更新结果
SELECT product_id, product_name, price FROM fgedu_products WHERE product_id = 1;
product_id | product_name | price
————+———————-+——-
1 | PostgreSQL数据库实战 | 99.90
(1 row)

3.2 更新多条记录

可以使用一条UPDATE语句更新多条记录。

— 更新多条记录
UPDATE fgedu_products
SET stock_quantity = stock_quantity + 50
WHERE category = ‘计算机图书’;

— 查询更新结果
SELECT product_id, product_name, category, stock_quantity FROM fgedu_products WHERE category = ‘计算机图书’;
product_id | product_name | category | stock_quantity
————+———————-+————+—————-
1 | PostgreSQL数据库实战 | 计算机图书 | 150
2 | Python编程基础 | 计算机图书 | 250
3 | Java核心技术 | 计算机图书 | 200
4 | 数据结构与算法 | 计算机图书 | 130
(4 rows)

3.3 带条件更新

可以使用WHERE子句指定更新条件,只更新符合条件的记录。

— 带条件更新
UPDATE fgedu_products
SET price = price * 1.1
WHERE category = ‘人工智能’ AND price < 100; -- 查询更新结果 SELECT product_id, product_name, category, price FROM fgedu_products WHERE category = '人工智能'; product_id | product_name | category | price ------------+----------------+----------+-------- 5 | 机器学习实战 | 人工智能 | 109.89 6 | 深度学习入门 | 人工智能 | 129.90 (2 rows)

3.4 使用子查询更新

可以在UPDATE语句中使用子查询来更新数据。

— 使用子查询更新
UPDATE fgedu_products
SET stock_quantity = stock_quantity – 20
WHERE product_id IN (SELECT product_id FROM fgedu_promotion_products);

— 查询更新结果
SELECT product_id, product_name, category, stock_quantity FROM fgedu_products WHERE category = ‘计算机图书’;
product_id | product_name | category | stock_quantity
————+———————-+————+—————-
1 | PostgreSQL数据库实战 | 计算机图书 | 130
2 | Python编程基础 | 计算机图书 | 230
3 | Java核心技术 | 计算机图书 | 180
4 | 数据结构与算法 | 计算机图书 | 110
(4 rows)

Part04-数据删除操作(DELETE)

4.1 基本删除语法

DELETE语句用于删除数据库表中的现有记录。

— 删除单条记录
DELETE FROM fgedu_products WHERE product_id = 7;

— 查询删除结果
SELECT * FROM fgedu_products WHERE product_id = 7;
product_id | product_name | category | price | stock_quantity | created_at
————+————–+———-+——-+—————-+————
(0 rows)

4.2 带条件删除

可以使用WHERE子句指定删除条件,只删除符合条件的记录。

— 带条件删除
DELETE FROM fgedu_promotion_products WHERE promotion_price > 100;

— 查询删除结果
SELECT * FROM fgedu_promotion_products;
promotion_id | product_id | product_name | original_price | promotion_price | promotion_start_date | promotion_end_date
————–+————+———————-+—————-+—————–+———————-+——————–
1 | 1 | PostgreSQL数据库实战 | 89.9 | 71.92 | 2026-04-02 | 2026-04-09
2 | 2 | Python编程基础 | 59.9 | 47.92 | 2026-04-02 | 2026-04-09
4 | 4 | 数据结构与算法 | 79.9 | 63.92 | 2026-04-02 | 2026-04-09
(3 rows)

4.3 删除所有记录

可以使用DELETE FROM语句删除表中的所有记录。

from oracle:www.itpux.com

— 删除所有记录
DELETE FROM fgedu_promotion_products;

— 查询删除结果
SELECT * FROM fgedu_promotion_products;
promotion_id | product_id | product_name | original_price | promotion_price | promotion_start_date | promotion_end_date
————–+————+————–+—————-+—————–+———————-+——————–
(0 rows)

4.4 使用子查询删除

可以在DELETE语句中使用子查询来删除数据。

— 重新插入一些促销商品数据
INSERT INTO fgedu_promotion_products (
product_id, product_name, original_price, promotion_price,
promotion_start_date, promotion_end_date
)
SELECT
product_id, product_name, price, price * 0.8,
CURRENT_DATE, CURRENT_DATE + INTERVAL ‘7 days’
FROM fgedu_products
WHERE category = ‘计算机图书’;

— 使用子查询删除
DELETE FROM fgedu_promotion_products
WHERE product_id IN (
SELECT product_id FROM fgedu_products WHERE price > 90
);

— 查询删除结果
SELECT * FROM fgedu_promotion_products;
promotion_id | product_id | product_name | original_price | promotion_price | promotion_start_date | promotion_end_date
————–+————+———————-+—————-+—————–+———————-+——————–
6 | 2 | Python编程基础 | 59.9 | 47.92 | 2026-04-02 | 2026-04-09
7 | 4 | 数据结构与算法 | 79.9 | 63.92 | 2026-04-02 | 2026-04-09
(2 rows)

Part05-生产案例与实战讲解

下面是一个综合实战案例,展示如何在实际项目中使用INSERT、UPDATE和DELETE操作。

— 创建订单表
CREATE TABLE fgedu_orders (
order_id SERIAL PRIMARY KEY,
customer_id INTEGER NOT NULL,
order_date TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
total_amount NUMERIC(12, 2) NOT NULL,
order_status VARCHAR(20) DEFAULT ‘pending’
);

— 创建订单详情表
CREATE TABLE fgedu_order_items (
order_item_id SERIAL PRIMARY KEY,
order_id INTEGER NOT NULL REFERENCES fgedu_orders(order_id),
product_id INTEGER NOT NULL REFERENCES fgedu_products(product_id),
quantity INTEGER NOT NULL CHECK (quantity > 0),
unit_price NUMERIC(10, 2) NOT NULL,
subtotal NUMERIC(12, 2) NOT NULL
);

— 1. 插入订单
BEGIN;

— 插入订单头信息
INSERT INTO fgedu_orders (customer_id, total_amount) VALUES (1, 239.70) RETURNING order_id;
order_id
———-
1
(1 row)

— 插入订单详情
INSERT INTO fgedu_order_items (order_id, product_id, quantity, unit_price, subtotal) VALUES
(1, 1, 1, 99.90, 99.90),
(1, 4, 2, 79.90, 159.80);

— 更新产品库存
UPDATE fgedu_products SET stock_quantity = stock_quantity – 1 WHERE product_id = 1;
UPDATE fgedu_products SET stock_quantity = stock_quantity – 2 WHERE product_id = 4;

— 提交事务
COMMIT;

— 2. 查询订单信息
SELECT
o.order_id, o.customer_id, o.order_date, o.total_amount, o.order_status,
i.order_item_id, i.product_id, i.quantity, i.unit_price, i.subtotal
FROM fgedu_orders o
JOIN fgedu_order_items i ON o.order_id = i.order_id
WHERE o.order_id = 1;
order_id | customer_id | order_date | total_amount | order_status | order_item_id | product_id | quantity | unit_price | subtotal
———-+————-+——————————-+————–+————–+—————+————+———-+————+———-
1 | 1 | 2026-04-02 18:30:00.123456+08 | 239.70 | pending | 1 | 1 | 1 | 99.9 | 99.9
1 | 1 | 2026-04-02 18:30:00.123456+08 | 239.70 | pending | 2 | 4 | 2 | 79.9 | 159.8
(2 rows)

— 3. 查询产品库存更新情况
SELECT product_id, product_name, stock_quantity FROM fgedu_products WHERE product_id IN (1, 4);
product_id | product_name | stock_quantity
————+———————-+—————-
1 | PostgreSQL数据库实战 | 129
4 | 数据结构与算法 | 108
(2 rows)

— 4. 更新订单状态
UPDATE fgedu_orders SET order_status = ‘shipped’ WHERE order_id = 1;

— 查询更新后的订单状态
SELECT order_id, order_status FROM fgedu_orders WHERE order_id = 1;
order_id | order_status
———-+————–
1 | shipped
(1 row)

— 5. 处理退货(删除订单)
BEGIN;

— 删除订单详情
DELETE FROM fgedu_order_items WHERE order_id = 1;

— 删除订单
DELETE FROM fgedu_orders WHERE order_id = 1;

— 恢复产品库存
UPDATE fgedu_products SET stock_quantity = stock_quantity + 1 WHERE product_id = 1;
UPDATE fgedu_products SET stock_quantity = stock_quantity + 2 WHERE product_id = 4;

— 提交事务
COMMIT;

— 6. 查询订单是否被删除
SELECT * FROM fgedu_orders WHERE order_id = 1;
order_id | customer_id | order_date | total_amount | order_status
———-+————-+————+————–+————–
(0 rows)

— 7. 查询产品库存恢复情况
SELECT product_id, product_name, stock_quantity FROM fgedu_products WHERE product_id IN (1, 4);
product_id | product_name | stock_quantity
————+———————-+—————-
1 | PostgreSQL数据库实战 | 130
4 | 数据结构与算法 | 110
(2 rows)

Part06-风哥经验总结与分享

1. INSERT操作建议:

  • 在插入大量数据时,使用批量插入(多条记录一次性插入)可以提高性能
  • 为自增字段(如SERIAL)插入数据时,不需要显式指定值,数据库会自动生成
  • 使用RETURNING子句可以获取插入记录的ID或其他字段值
  • 插入数据时,应确保数据类型匹配和约束满足,避免插入失败

2. UPDATE操作建议:

  • 始终在UPDATE语句中使用WHERE子句,否则会更新表中的所有记录
  • 在更新大量数据时,可以分批更新,避免长时间锁定表
  • 使用事务确保相关更新操作的原子性
  • 在更新前,使用SELECT语句验证WHERE条件的正确性

3. DELETE操作建议:

  • 始终在DELETE语句中使用WHERE子句,否则会删除表中的所有记录
  • 在删除大量数据时,可以分批删除,避免长时间锁定表
  • 使用事务确保相关删除操作的原子性
  • 在删除前,使用SELECT语句验证WHERE条件的正确性
  • 考虑使用TRUNCATE TABLE语句删除表中的所有记录,它比DELETE FROM更快,但不能回滚
风哥提示:在生产环境中,执行UPDATE和DELETE操作时,一定要非常小心,最好先在测试环境中验证,或者在执行前使用BEGIN开启事务,执行后检查结果,确认无误后再提交事务,避免误操作导致数据丢失。

4. 性能优化建议:

  • 为WHERE子句中的字段创建索引,提高查询和更新效率
  • 避免在WHERE子句中对字段进行函数操作,否则会导致索引失效
  • 在插入大量数据时,考虑禁用索引和约束,插入完成后再启用
  • 使用批量操作减少数据库连接开销

5. 数据安全建议:

  • 使用参数化查询避免SQL注入攻击
  • 限制用户的DML操作权限,只授予必要的权限
  • 定期备份数据库,以防止数据丢失
  • 使用事务确保数据的一致性和完整性

更多视频教程www.fgedu.net.cn

更多学习教程公众号风哥教程itpux_com

from PostgreSQL:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息