在已有的表上定义生成列注意那些问题

本文详细介绍了在数据库中创建生成列的过程,包括将表置于检查挂起状态、添加生成列以及更新生成列的多种方法。同时,文章还讨论了在表大小和日志空间限制下的操作策略。

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

生成列会在基本表上进行定义,它所存储的值是通过表达式计算得到的。
为了在已有的表上定义生成列,必须完成以下步骤:
1.将表至于检查挂起状态:
语法:
    SET INTEGRITY FOR <table name> off
示例:
db2pdb@root:~>db2  SET INTEGRITY FOR book1 off
DB20000I  SQL 命令成功完成。
2.对表进行修改,以增加一个或者多个生成列:
语法:
    alter table <table name> 
    add column <column name3> integer(列类型) generated always as(<column name1>+<column name2>),
    add column <column name4> integer(列类型) generated always as
    (case when<column name1>><column name2> then 1 else null end)
示例:
db2pdb@root:>db2 "alter table book1 add column b_temp integer generated always
as(b_id+b_ino)"
DB20000I  SQL 命令成功完成。
3.根据在表上所做的工作的不同,可以使用几种方法完成相应的任务:
  1)表非常大,不能够保证有足够的日志空间来完成这项任务。在将数据载入,开始一致性检查之前,
     需要commit。即使表已经处于检查挂起状态,在这个处理期间也会对其进行锁定。
     如果估计用于更新生成列的日志空间足够进行set integrity(设置一致性),可以使用一下语句:
db2pdb@root:>db2 set integrity for book1 immediate checked force generated
DB20000I  SQL 命令成功完成。
  2)表非常大,但是不能保证有足够的日志空间来完成这项任务,需要完成如下工作:
     获得表的排斥锁,这将会防止除了没有提交的读入事务之外的所有其他事务访问表。
     可以使用下面的语句:
     lock table <table name1> in <exclusive|share>mode
     将表调整为具有没有检查数据的在线状态:
     set integrity for<table name> all immediate unchecked
     使用间歇式提交和判定来更新生成列,以防止将日志填满:
     update<table name1>set(<column name3>,<column name4>)=(default,default) where<predicate>
     使表处于在线状态,检查一致性:
     set integrity for<table name> off
     set integrity for<table name1> immediate checked
     使用commit语句完成事务,解除表的锁定:
     commit
     在使用生成的列值的时候,使用not logged initially选项,将标的日志关闭
     激活not logged initially选项的语句如下:
     alter table<table name>activate not logged initially
     生成值的语句如下:
     set integrity for<table name1> immediate checked force generated
     通过提交事务处理再次关闭not logged initially选项:
     commit
注:生成列只能够在可以定义等于比较的数据类型上定义。
    不能够用于限制,惟一索引,参照限制,主键以及全局临时表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值