增加字段,对原有记录的影响

本文探讨了在SQL中修改表结构时的不同方法及其对触发器的影响。通过对比单个语句添加字段并设置默认值与分两步执行这两种方式,发现前者会更新现有记录并触发触发器,而后者则不会。此外还讨论了修改字段默认值时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前两天看到别人脚本,有个增加字段并且提供默认值的操作发生了变化。以前是分两步写的,这次放在一个语句中,于是就触发了当前表上面的触发器。(表中已经有数据)

 

一个语句:

alter table test_ddl add (add_c1 number(2) default 0);

其实这个语句,不论新增字段是否非空,都会对原有记录进行update,从而触发器被触发。

 

两步执行:

alter table test_ddl add (add_c1 number(2));

alter table test_ddl modify (add_c1 default 0);

这个操作就不会修改原有记录。

 

找了一下文档,只发现了对第一个操作的说明。

 

If you add a column, then the initial value of each row for the new column is null unless you specify the DEFAULT clause. In this case, Oracle Database updates each row in the new column with the value you specify for DEFAULT. This update operation, in turn, fires any AFTER UPDATE triggers defined on the table.

 

而且还有关于修改默认值,会在字典中保留错误信息的提示。

Note:

If a column has a default value, then you can use the DEFAULT clause to change the default to NULL, but you cannot remove the default value completely. That is, if a column has ever had a default value assigned to it, then the DATA_DEFAULT column of the USER_TAB_COLUMNS data dictionary view will always display either a default value or NULL.

 

验证了一下,确实如此。

alter table test_ddl modify (add_c1 default null);

 

SQL> select t.column_name, t.default_length, t.data_default from user_tab_cols t where t.table_name = 'TEST_DDL';
 
COLUMN_NAME                    DEFAULT_LENGTH DATA_DEFAULT
------------------------------ -------------- --------------------------------------------------------------------------------
ID#                                          
VAL                                           
ADD_C1                                      4 null
 
SQL>

 

摆明了是错误信息啊。

 

但是关于modify默认值的说明,没有看到。不知道哪位能够提供一下。

 

### 使用 MyBatis-Plus 进行分组查询并添加聚合函数 在 MyBatis-Plus 中,可以通过 `QueryWrapper` 或者 `LambdaQueryWrapper` 来构建 SQL 查询语句中的复杂条件,并且能够方便地加入聚合函数。对于分组查询以及在此基础上应用聚合函数的操作,具体实现如下所示。 #### 构建带有聚合函数的分组查询 为了执行带聚合函数的分组查询,可以使用 `select()` 方法指定要查询的字段及其对应的聚合表达式,再通过 `groupBy()` 定义分组依据。如果还需要进一步过滤,则可借助于 `having()` 设置HAVING子句条件[^2]。 ```java // 创建 QueryWrapper 实例 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.select("count(*) as count", "sum(age) as totalAge") // 指定查询列及聚合计算方式 .groupBy("gender") // 设定分组标准 .having("count(*) > {0}", 10); // 应用 HAVING 子句限制结果集大小 // 执行查询并将结果映射到 Map 集合中 List<Map<String, Object>> resultList = userMapper.selectMaps(wrapper); ``` 上述代码片段展示了如何创建一个基于用户的查询对象 (`User`) 并对其进行统计分析的过程。这里选择了两个聚合指标——记录数量(`COUNT()`) 和年龄总和(`SUM(age)`), 同时按照性别(`gender`)进行了分类汇总;最后还加入了对每个性别类别下至少有十个成员的要求作为额外约束条件。 #### 获取结果列表 当调用了 `userMapper.selectMaps(wrapper)` 后会得到一个由键值对组成的集合形式的结果表单,其中每一项代表了一个独立的数据单元(即一条满足给定条件后的统计数据)。这些数据可以直接用于前端展示或其他业务逻辑处理环节之中。 #### 关联问题探讨 MyBatis-Plus 提供了一套简洁高效的 API 接口使得开发者可以在不脱离原有框架生态的前提下轻松完成诸如分页、排序、关联查询等一系列高级特性开发工作。除了上面提到的基础 CRUD 功能之外,它也支持更多样化的自定义需求场景下的灵活运用[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值