5

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 文字になったことに注意してください。誰もこれを見たことがありますか?

4

2 に答える 2

4

ACCOUNTNAMEこれは、列定義とメタデータを持つ を選択しなくなったためです。replaceむしろ、メタデータを持たない関数の結果である STRING を選択しています。これはまったく異なるデータ型です。

(潜在的に) より良い方法は、元の列を持つクエリを使用してテーブルを作成することですが、WHERE0 行を保証する句を使用します。

次に、実際のを使用して通常どおりテーブルに挿入できますSELECT

0 行のクエリを実行しても、列のメタデータは引き続き取得されるため、テーブルを作成する必要がありますが、行は挿入されません。句は、絶対に存在しないことがわかっているWHEREのように、速いものにするようにしてください。WHERE primary_key = -999999

于 2013-07-18T20:01:06.727 に答える