【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】4.0社区版
【问题描述】
说明:CTAS 是 create table as 的简称,在各种关系型数据库中都支持的最基本的建表命令。
oceanbase这个系统数据库继承了一些Oracle数据库比较经典的动态性能视图,比如:
v$session_wait, v$sessstat, v$sysstat等等,下面我们在test数据库尝试建个新表,将
v$session_wait的数据复制到新表。
要完成这个任务,最简单的实现方式就是使用CTAS命令:
create table test1 as select * from oceanbase.v$session_wait;
结果,出错了,错误信息如下:
ERROR 1048 (23000): Column ‘TIME_REMAINING_MICRO’ cannot be null
接下来,我们执行 describe oceanbase.v$session_wait 看看这个视图的结构:
再查下这个视图看看有什么数据吧 ?
select time_remaining_micro,time_since_last_wait_micro from oceanbase.v$session_wait;
结论: time_remaining_mircro 这个列的值有NULL。
看来CTAS 不好使了 ? 非也,还是使用CTAS, 只不过不插入数据,只创建表结构
use test;
create table test1 as select * from oceanbase.v$session_wait where 1=0;
接下来使用传统的insert into 命令插入数据:
insert into test1 select * from oceanbase.V$SESSION_WAIT;
又出错了,还是之前的错误 "column ‘TIME_REMAINING_MICRO’ cannot be null "
ERROR 1048 (23000): Column ‘TIME_REMAINING_MICRO’ cannot be null
看来 只能修改列的属性了:
alter table test1 modify TIME_REMAINING_MICRO bigint(20) default NULL;
然后再执行insert 操作,这次总算成功了
insert into test1 select * from oceabase.v$session_wait;
总结一下: 在oracle中我经常用这种方式来快速创建用于测试的临时表,
从来没遇到这个问题。难道ob会存在这种低级错误 ?
【复现路径】
按照上面的测试步骤, 100%复现。
【问题现象及影响】
影响倒不是很大,有workaround, 但是用户体验不太好。
【附件】