OpenGauss数据更新与删除 核心详细教程

数据更新与删除 核心详细教程

核心总览

本章核心是SQL两大核心数据写操作(DML操作),直接修改数据库中的持久化数据,操作后会永久生效(无事务回滚情况下),因此核心原则:先查后操作,无WHERE条件绝不执行,安全优先

两大核心操作区别:

  • UPDATE:仅修改表中已有记录的指定字段值,不新增、不删除行,原有行结构保持不变;

  • DELETE:直接删除表中的整行记录,仅保留表结构、索引和约束,删除后的数据难以恢复。

贯穿全教程的基础表(5个属性,简洁实用)

1. 表结构:员工表staff(适配日常业务场景,仅5个核心字段)

字段名 数据类型 字段说明 约束条件 补充说明
staff_id INT 员工编号 主键(PRIMARY KEY)、唯一 唯一标识员工,用于精准定位单条记录
staff_name VARCHAR(20) 员工姓名 非空(NOT NULL) 不可为空,确保每条记录都有员工姓名
dept VARCHAR(20) 所属部门 可用于批量筛选(如销售部、技术部)
salary INT 月薪(元) 数值类型,支持算术运算(如涨薪、降薪)
entry_date DATE 入职日期 日期类型,支持范围筛选(如入职时间范围)

2. 初始测试数据(全教程所有操作均基于此数据,可直接复制执行)

-- 1. 建表语句(确保表结构正确,适配后续所有操作)
CREATE TABLE staff (
    staff_id INT PRIMARY KEY,  -- 主键,唯一标识员工
    staff_name VARCHAR(20) NOT NULL,  -- 员工姓名,不可为空
    dept VARCHAR(20),  -- 所属部门
    salary INT,  -- 月薪
    entry_date DATE  -- 入职日期
);

-- 2. 插入初始测试数据(4条记录,覆盖不同部门、薪资、入职日期)
INSERT INTO staff VALUES
(1, '张三', '销售部', 6000, '2022-03-15'),
(2, '李四', '技术部', 8000, '2021-07-01'),
(3, '王五', '销售部', 5500, '2023-01-10'),
(4, '赵六', '行政部', 4500, '2022-09-20');

一、UPDATE 数据更新(核心操作,详细拆解)

1. 核心语法&详细拆解(生产环境唯一推荐写法)

UPDATE 表名
SET 字段1=新值1, 字段2=新值2, ...  -- 核心赋值部分,支持多字段同时修改
WHERE 筛选条件;  -- 安全核心,锁定要修改的记录范围,不可省略(除非特殊需求)

语法详细说明

  • UPDATE 表名:指定要修改数据的目标表,不可写错表名,否则会修改错误表的数据;

  • SET 子句:用于指定要修改的字段和对应新值,支持3种赋值方式:

  • 固定常量值:如 salary=6500,直接给字段赋具体值;

  • 字段自身运算:如 salary=salary*1.1(薪资涨10%),基于字段原有值计算后覆盖;

  • 简单表达式:如 dept='营销部'(部门名称修改),适用于字符类型字段。

  • WHERE 子句:筛选要修改的记录,核心作用是“缩小修改范围”,避免误改全表;筛选条件可结合字段值、逻辑运算符(AND/OR)使用。

连贯实操示例(基于staff表,覆盖不同场景)

-- 示例1:修改单条记录(精准修改,零风险)
-- 需求:修改员工编号1(张三)的月薪为6500元,同时补充其部门备注(无则不修改)
-- 安全操作步骤:先查询确认要修改的记录,再执行更新
SELECT * FROM staff WHERE staff_id=1;  -- 先查:确认张三的当前信息,避免修改错误
UPDATE staff
SET salary=6500  -- 仅修改薪资字段,其他字段不变
WHERE staff_id=1;  -- 用主键筛选,精准锁定1条记录,无误改风险

-- 示例2:批量修改多条记录(多字段同时修改)
-- 需求:给销售部所有员工薪资涨10%,同时将部门名称统一改为「营销部」
-- 安全操作步骤:先查询销售部员工,确认范围后再更新
SELECT * FROM staff WHERE dept='销售部';  -- 先查:确认销售部有张三、王五2名员工
UPDATE staff
SET salary=salary*1.1, dept='营销部'  -- 同时修改薪资和部门两个字段
WHERE dept='销售部';  -- 按部门筛选,批量修改符合条件的所有记录

-- 示例3:结合条件筛选的修改(多条件锁定范围)
-- 需求:给技术部、月薪低于7000元的员工,月薪加800元
SELECT * FROM staff WHERE dept='技术部' AND salary<7000;  -- 先查:确认符合条件的员工(本例中无,可验证)
UPDATE staff
SET salary=salary+800
WHERE dept='技术部' AND salary<7000;  -- 多条件筛选,进一步缩小修改范围

2. 进阶安全用法(ORDER BY + LIMIT,降低批量修改风险)

当需要批量修改数据,但不确定筛选条件的精准性时,可结合排序(ORDER BY)和限量(LIMIT),限定最大修改行数,避免误改过多数据,是生产环境批量修改的最佳实践。

UPDATE 表名
SET 字段=新值
[WHERE 筛选条件]  -- 可选,进一步缩小范围
ORDER BY 排序字段 ASC/DESC  -- 按指定字段排序,确定修改优先级
LIMIT 最大修改行数;  -- 限定最多修改的行数,核心安全保障

连贯实操示例(基于staff表)

-- 需求:给全公司薪资最低的2名员工,月薪各加500元(避免误改过多员工)
-- 安全步骤:先查询薪资最低的2名员工,确认后再执行
SELECT * FROM staff ORDER BY salary ASC LIMIT 2;  -- 先查:确认是赵六(4500)、王五(5500)
UPDATE staff
SET salary=salary+500
ORDER BY salary ASC  -- 按薪资升序排序,优先修改薪资最低的员工
LIMIT 2;  -- 最多修改2条,即使筛选条件有误,也不会影响更多数据

3. 核心避坑红线(必看,避免生产事故)

  • 严禁无WHERE条件的全表更新:省略WHERE子句,会修改表中所有行的指定字段,比如UPDATE staff SET salary=5000;会把所有员工薪资改为5000,生产环境绝对禁用;

  • 必须先查后改:执行UPDATE前,务必用相同的WHERE条件执行SELECT查询,确认修改范围和记录无误后,再执行更新,避免修改错误数据;

  • 优先用主键筛选:主键(如staff_id)能唯一定位1条记录,是最安全的筛选条件,避免用非唯一字段(如dept、salary)作为唯一筛选条件,防止误改大量数据;

  • 注意字段类型匹配:给字段赋值时,需与字段数据类型一致,比如给salary(INT类型)赋字符串值,会导致语句执行失败。

二、DELETE 数据删除(核心操作,详细拆解)

1. 核心语法&amp;详细拆解(生产环境唯一推荐写法)

DELETE FROM 表名
WHERE 筛选条件;  -- 安全核心,锁定要删除的记录范围,不可省略(除非特殊需求)

语法详细说明

  • DELETE FROM 表名:指定要删除数据的目标表,FROM关键字不可省略,否则语法错误;

  • WHERE 子句:筛选要删除的记录,核心作用是“锁定删除范围”,删除后的数据难以恢复,因此筛选条件必须精准;可结合主键、多条件筛选,确保删除正确记录。

连贯实操示例(基于staff表,覆盖不同场景)

-- 示例1:删除单条记录(精准删除,零风险)
-- 需求:删除员工编号4(赵六)的记录(假设赵六离职)
-- 安全操作步骤:先查询确认,再执行删除
SELECT * FROM staff WHERE staff_id=4;  -- 先查:确认赵六的信息,避免删除错误员工
DELETE FROM staff
WHERE staff_id=4;  -- 用主键筛选,精准锁定1条记录,无误删风险

-- 示例2:批量删除多条记录(按条件筛选)
-- 需求:删除2023年及之后入职的员工记录(假设该批次员工离职)
-- 安全操作步骤:先查询确认范围,再执行删除
SELECT * FROM staff WHERE entry_date >= '2023-01-01';  -- 先查:确认只有王五(2023-01-10)符合条件
DELETE FROM staff
WHERE entry_date >= '2023-01-01';  -- 按入职日期筛选,批量删除符合条件的记录

-- 示例3:多条件筛选删除(精准锁定目标记录)
-- 需求:删除营销部(原销售部)、月薪低于6000元的员工记录
SELECT * FROM staff WHERE dept='营销部' AND salary<6000;  -- 先查:确认符合条件的记录
DELETE FROM staff
WHERE dept='营销部' AND salary<6000;  -- 多条件筛选,避免误删其他部门员工

2. 进阶安全用法(ORDER BY + LIMIT,批量删除更安全)

批量删除数据时,结合排序和限量,既能控制删除行数,又能按业务需求确定删除优先级,避免误删全表,同时减少锁表风险(大量数据一次性删除会锁表,影响业务)。

DELETE FROM 表名
[WHERE 筛选条件]  -- 可选,进一步缩小删除范围
ORDER BY 排序字段 ASC/DESC  -- 按指定字段排序,确定删除优先级
LIMIT 最大删除行数;  -- 限定最多删除的行数,控制风险

连贯实操示例(基于staff表)

-- 需求:删除入职时间最早的1名员工(假设老员工退休)
-- 安全步骤:先查询确认入职最早的员工,再执行删除
SELECT * FROM staff ORDER BY entry_date ASC LIMIT 1;  -- 先查:确认是李四(2021-07-01)
DELETE FROM staff
ORDER BY entry_date ASC  -- 按入职日期升序排序,优先删除入职最早的员工
LIMIT 1;  -- 最多删除1条,即使筛选条件有误,损失也最小

-- 拓展:批量分批删除(适合大量数据删除)
-- 需求:删除营销部所有员工,分批删除(每次删1条,避免锁表)
-- 先查:SELECT * FROM staff WHERE dept='营销部';
DELETE FROM staff WHERE dept='营销部' LIMIT 1;  -- 第一次删1条
-- 重复执行,直到删除完所有营销部员工(可结合循环,简化操作)

3. 核心避坑红线(必看,避免生产事故)

  • 严禁无WHERE条件的全表删除:省略WHERE子句,会清空表中所有记录,比如DELETE FROM staff;会删除所有员工数据,属于最高危操作,生产环境绝对禁用;

  • 必须先查后删:执行DELETE前,务必用相同的WHERE条件执行SELECT查询,确认删除范围和记录无误后,再执行删除,数据删除后恢复成本极高;

  • 批量数据分批删:删除大量数据时,不要一次性删除所有符合条件的记录,用LIMIT分批执行(如每次删100条),避免长时间锁表,影响线上业务;

  • 注意外键约束(补充):如果当前表的字段是其他表的外键(如staff_id是员工考勤表的外键),直接删除会报错,需先删除关联表的相关记录,再删除当前表记录。

三、全流程连贯实操总结(可直接复制执行验证)

-- 1. 建表并插入初始数据
CREATE TABLE staff (
    staff_id INT PRIMARY KEY,
    staff_name VARCHAR(20) NOT NULL,
    dept VARCHAR(20),
    salary INT,
    entry_date DATE
);
INSERT INTO staff VALUES
(1, '张三', '销售部', 6000, '2022-03-15'),
(2, '李四', '技术部', 8000, '2021-07-01'),
(3, '王五', '销售部', 5500, '2023-01-10'),
(4, '赵六', '行政部', 4500, '2022-09-20');

-- 2. UPDATE操作(3个场景)
-- 2.1 精准修改单条记录
SELECT * FROM staff WHERE staff_id=1;
UPDATE staff SET salary=6500 WHERE staff_id=1;

-- 2.2 批量修改多字段
SELECT * FROM staff WHERE dept='销售部';
UPDATE staff SET salary=salary*1.1, dept='营销部' WHERE dept='销售部';

-- 2.3 进阶限量修改
SELECT * FROM staff ORDER BY salary ASC LIMIT 2;
UPDATE staff SET salary=salary+500 ORDER BY salary ASC LIMIT 2;

-- 3. DELETE操作(3个场景)
-- 3.1 精准删除单条记录
SELECT * FROM staff WHERE staff_id=4;
DELETE FROM staff WHERE staff_id=4;

-- 3.2 批量条件删除
SELECT * FROM staff WHERE entry_date >= '2023-01-01';
DELETE FROM staff WHERE entry_date >= '2023-01-01';

-- 3.3 进阶限量删除
SELECT * FROM staff ORDER BY entry_date ASC LIMIT 1;
DELETE FROM staff ORDER BY entry_date ASC LIMIT 1;

全程基于staff表,每个操作都遵循“先查后操作”的安全原则,覆盖日常开发中最常用的场景,既详细又不冗余,可直接用于学习和实操。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容