表中已有数据,将表中某个字段为空的改为非空

本文介绍了一种在Oracle数据库中高效地将表字段修改为非空的方法,尤其适用于大型表。通过使用enablenovalidate属性,可以仅对新插入的数据应用非空约束,并逐步处理现有数据。
1.需求:
  表t中大概有5亿条数据,现需要将表中的is_validate字段改为非空。考虑到表中有大量数据,而且表还是实时插入,如果直接修改为not null,将会使用很长时间。
发现加not null 可以使旧的数据不生效,只对新数据生效。即enable novalidate属性.
2.实施过程:
 1)查看表结构
  SQL> desc t
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ---------------

 BATCH_ID                                  NOT NULL NUMBER(11)
 OUTPUT_ID                                          NUMBER(14)
 OUTFALL_TYPE                                       NUMBER(4)
 FLUX_VALUE                                         NUMBER(20,3)
 MEASURE_TIME                                       DATE
 IS_MEASURE                                         CHAR(1)
 FLUX_SUM                                           NUMBER(20,3)
 INSERT_TIME                                        DATE
 IS_VALIDATE                                        CHAR(1)
2)修改字段is_validate为非空,只对新数据生效
SQL> alter table t modify is_validate not null enable novalidate;
表已更改。
已用时间:  00: 00: 00.85
3)更新表中为空的值
SQL> update t set is_validate=0 where is_validate is null;
已更新7766852行。
已用时间:  00: 30: 18.67
SQL> commit;
4)查看约束状态
SQL> select table_name,constraint_name,status,deferrable,deferred,validated from user_constraints where table_name='T';

TABLE_NAME                     CONSTRAINT_NAME                STATUS   DEFERRABLE     DEFERRED  VALIDATED
------------------------------ ------------------------------ -------- -------------- --------- -------------
T                  SYS_C005606                    ENABLED  NOT DEFERRABLE IMMEDIATE NOT VALIDATED

已用时间:  00: 00: 00.00

4)启用约束
SQL> alter table t modify constraint sys_c005606 enable validate;
表已更改。

已用时间:  00: 02: 39.90

5)使trace跟踪查看两者调用情况

alter session set events '10046 trace name context forever, level 12';

alter table t modify status not null enable novalidate;
alter session set events '10046 trace name context off';

alter session set events '10046 trace name context forever, level 12';

alter table t modify status not null;
alter session set events '10046 trace name context off';


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26937943/viewspace-1658903/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26937943/viewspace-1658903/

在 SQL 中,如果你想将一个字段设置为**(NOT NULL)**,你需要使用 `ALTER TABLE` 语句来修改字段的定义。具体语法会根据你使用的数据库系统略有不同,下面以 **MySQL** 为例进行说明。 --- ## 一、使用 `ALTER TABLE ... MODIFY` 修改字段 ### ✅ 语法: ```sql ALTER TABLE 名 MODIFY 字段字段类型 NOT NULL; ``` > ⚠️ 注意:字段类型必须与原字段类型一致(包括长度、符号等),否则会改变字段结构。 --- ### ✅ 示例: 假设你有一个 `users`,结构如下: ```sql CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50), email VARCHAR(100) ); ``` 现在你想将 `email` 字段改为: ```sql ALTER TABLE users MODIFY email VARCHAR(100) NOT NULL; ``` --- ## 二、注意事项 1. **字段已有数据是否为 NULL**: - 如果字段中已经有 `NULL` 值,设置为 `NOT NULL` 会失败。 - 你需要先将 `NULL` 值替换为默认值或有效数据。 ```sql UPDATE users SET email = 'default@example.com' WHERE email IS NULL; ``` 2. **字段类型必须一致**: - 修改字段为 `NOT NULL` 时,必须保留原始字段类型(包括长度、精度等)。 3. **性能影响**: - 对大操作时,`MODIFY` 可能会导致重建,影响性能。 --- ## 三、使用 C++ 和 MySQL Connector/C++ 执行修改字段 你也可以在 C++ 程序中使用 MySQL Connector/C++ 来执行修改字段的 SQL 语句。 ### 示例代码: ```cpp #include <mysql_driver.h> #include <mysql_connection.h> #include <cppconn/statement.h> #include <cppconn/exception.h> #include <iostream> int main() { try { sql::mysql::MySQL_Driver *driver; sql::Connection *con; // 获取驱动并连接数据库 driver = sql::mysql::get_mysql_driver_instance(); con = driver->connect("tcp://127.0.0.1:3306", "your_username", "your_password"); con->setSchema("your_database"); sql::Statement *stmt = con->createStatement(); // 执行修改字段为 NOT NULL 的 SQL 语句 stmt->execute("ALTER TABLE users MODIFY email VARCHAR(100) NOT NULL"); std::cout << "字段 email 已成功修改。" << std::endl; delete stmt; delete con; } catch (sql::SQLException &e) { std::cerr << "SQL Error: " << e.what() << std::endl; std::cerr << "Error Code: " << e.getErrorCode() << std::endl; std::cerr << "SQL State: " << e.getSQLState() << std::endl; } return 0; } ``` --- ## 四、不同数据库语法差异 | 数据库 | 修改字段为 NOT NULL 的语法 | |--------|-----------------------------| | MySQL | `ALTER TABLE 名 MODIFY 字段名 类型 NOT NULL;` | | PostgreSQL | `ALTER TABLE 名 ALTER COLUMN 字段名 SET NOT NULL;` | | SQL Server | `ALTER TABLE 名 ALTER COLUMN 字段名 类型 NOT NULL;` | | Oracle | `ALTER TABLE 名 MODIFY (字段名 类型 NOT NULL);` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值