“创建表为选择”不保留不为空

Joe*_*lla 5 oracle create-table

我正在尝试使用 Oracle 的“按选择创建表”功能进行快速更新。我看到的问题是“空”字段没有被保留。

我定义了下表:

create table mytable(
  accountname varchar2(40) not null,
  username varchar2(40)
 );
Run Code Online (Sandbox Code Playgroud)

当我执行原始 CTAS 时,帐户上的 NOT NULL 被保留:

 create table ctamytable as select * from mytable;

 describe ctamytable;

Name        Null     Type         
----------- -------- ------------ 
ACCOUNTNAME NOT NULL VARCHAR2(40)

USERNAME             VARCHAR2(40) 
Run Code Online (Sandbox Code Playgroud)

但是,当我对帐户名进行替换时,不会保留 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) 
Run Code Online (Sandbox Code Playgroud)

请注意,该accountname字段不再有空值,并且该varchar2字段从 40 个字符变为 160 个字符。有没有人见过这个?

Wil*_*ung 4

这是因为您不再选择ACCOUNTNAME具有列定义和元数据的 。相反,您选择的是一个 STRING,即函数的结果replace,它没有任何元数据。这是完全不同的数据类型。

一种(可能)更好的可行方法是使用包含原始列的查询来创建表,但使用WHERE保证 0 行的子句。

然后你就可以用你的实际数据正常插入到表中SELECT

通过查询 0 行,您仍然会获得列元数据,因此应该创建表,但不会插入任何行。确保你的WHERE子句是快速的,比如WHERE primary_key = -999999,一些你知道永远不会存在的数字。

  • 无需冒险使用幻数来匹配行,您只需将 WHERE 子句设置为 1=2 即可。 (2认同)