我正在尝试使用Oracle的“Create Table As Select”功能进行快速更新.我看到的问题是“Null”字段没有被保留.
我定义了下表:
create table mytable( accountname varchar2(40) not null,username varchar2(40) );
当我执行原始CTAS时,帐户上的NOT NULL将被保留:
create table ctamytable as select * from mytable; describe ctamytable; Name Null Type ----------- -------- ------------ ACCOUNTNAME NOT NULL VARCHAR2(40) USERNAME VARCHAR2(40)
但是,当我在accountname上执行替换时,不会保留NOT NULL.
create table ctamytable as select replace(accountname,'foo','foo2') accountname,username from mytable; describe ctamytable; Name Null Type ----------- ---- ------------- ACCOUNTNAME VARCHAR2(160) USERNAME VARCHAR2(40)
请注意,accountname字段不再为null,varchar2字段为40到160个字符.谁看过这个吗?
解决方法
这是因为您不再选择具有列定义和元数据的ACCOUNTNAME.而是选择STRING,即replace函数的结果,它没有任何元数据.这完全是一种不同的数据类型.
可能更好的方法是使用带有原始列的查询创建表,但使用WHERE子句保证0行.
然后您可以使用实际的SELECT正常插入表格.
通过查询0行,您仍将获得列元数据,因此应创建表,但不会插入任何行.确保你的WHERE子句快速,如WHERE primary_key = -999999,你知道的某些数字永远不会存在.