慎用create table as select,不會copy約束,主鍵什么東東都不會復制


 

1、再做一些數據遷移時候,很多人會使用create table  as select * from table where id=-1的方式來年建立一摸一樣的表,但是這樣做有個很大的弊端,不能將原表中的default value也一同遷移過來。

2、  Using the CREATE TABLE ... AS SELECT ... command: This command will copy acrooss to the new table all the data,but the constraints triggers ,and so on will not be transferred to the new table.

        那些都是not null約束,其他的約束和trigger是帶不過來了,嚴格說來not null也是約束的一種,只不過教材上把它排除在外了吧。

慎用create table as select,一定要注意默認值的問題

博客分類:   Oracle

再做一些數據遷移時候,很多人會使用create table  as select * from table where id=-1的方式來年建立一摸一樣的表,但是這樣做有個很大的弊端,不能將原表中的default value也一同遷移過來,可以看下面的例子:

 

第一,新建一個表

 

-- Create table
create table table01
(
  id        number(16),
  add_date  date default sysdate,
  status    number(1),
  entp_code varchar2(200)
)

 

第二,使用create table table02 as
select * From table01 where id=-1

 

第三、看看兩個表的結構,會發現第二張表的defaule value沒有了,如下2圖,可以很明顯看出來,表02的add_date的默認值得sysdate沒有了

table01的表結構

 table02的表結構


 

所以各位在做數據庫遷移時候,使用create table as select時候,一定要注意默認值的問題

 

上周,因為此問題,導致生產環境下產生了大量的問題,頭大了一天,特此奉獻出來。

====================================================================

 

Create table as select 語句的兩點說明

SQL > create table emp_copy as select * from emp where deptno=10;

第一,注意emp_copy表中沒有定義任何列名,因為我們在列子句中用通配符從emp表取得數據,讓Oracle像emp表中一樣生成emp_copy表中的列——相同名稱,相同數據類型定義。

第二,SQL*PLUS中可以發出的任何select語句可以放在create table as select 語句中,然后Oracle會自動獲得從emp表選擇的數據,在進emp_copy表中。但是 如果select語句的列子句中包括特定列清單,則create table子句列出表中要包括的列或者不列,例如:

SQL > create table emp_copy_2 (empno,sal) as select empno, sal from emp where deptno=10,或者

create table emp_copy_1  as select empno, sal from emp where deptno=10;都可以  不寫和寫列都可以

========================================================

 

 

大家都知道create table a as select * from b可以創建一個與b表結構一樣的表,但是在實際應用中最好不要這么創建表。原因是這樣只創建表的結構,而不會將原表的默認值一起創建。

說白了,表結構出來了,默認值沒有。

另外,但是有一個我對一個大表執行create table a as select * from b時候報了一個temp表空間不足,不知道是什么原因,記錄一下。下次發現在處理吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM