生成列会在基本表上进行定义,它所存储的值是通过表达式计算得到的。
为了在已有的表上定义生成列,必须完成以下步骤:
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
注:生成列只能够在可以定义等于比较的数据类型上定义。
不能够用于限制,惟一索引,参照限制,主键以及全局临时表。
在已有的表上定义生成列注意那些问题
最新推荐文章于 2023-04-19 23:26:49 发布