Perdi a Chave Primária num CTAS?

Boa Tarde.

 

É uma pratica comum no Oracle o uso de CTAS devido à sua simplicidade e eficácia no entanto queria aqui realçar uma 
das muitas propriedades dos CTAS que por vezes é esquecida. 

 

Nos CTAS (Create Table as Select) algumas informações são perdidas como por exemplo

chaves primarias, integridade referencial, grants, partições, tablespaces, etc..

 

Como exemplo do que disse anteriormente:

 

SQL> create table a_test(
2 f1 number constraint C_PRIMARY_KEY primary key,
3 f2 number constraint C_NOT_NULL not null
4 );

Table created.

SQL> create table b_test as select * from a_test;

Table created.

SQL> desc a_test;
Name Null? Type
----------------------------------------- -------- ------------------
F1 NOT NULL NUMBER
F2 NOT NULL NUMBER

SQL> desc b_test;
Name Null? Type
----------------------------------------- -------- -------------------
F1 NUMBER
F2 NOT NULL NUMBER

 

Como podem reparar desapareceu o NOT NULL da coluna F1 o que significa que a chave

primária desapareceu aquando do CTAS. Como referido anteriormente este é um tipo de
informação que se perde quando se faz um CTAS. Se repararem atentamente a coluna F2
mantem a propriedade NOT NULL, o que nos leva a concluir que o NOT NULL é preservado
aquando do CTAS.
Apenas para complementar, o exemplo seguinte prova que o tablespace não é de forma alguma

herdado da tabela fonte:



SQL> create table c_test (F1 number constraint C_PRIMARY_KEY primary key) tablespace SYSAUX;

Table created.

SQL> create table d_test as select * from c_test;

Table created.

SQL> create table z_test (F1 number);

Table created.

SQL> select table_name, tablespace_name from dba_tables 
where table_name in ('C_TEST', 'D_TEST', 'Z_TEST');


TABLE_NAME TABLESPACE_NAME
----------------------- ------------------------------------------------------------------------
Z_TEST SYSTEM
D_TEST SYSTEM
C_TEST SYSAUX

Como podem notar facilmente o tablespace da tabela d_test é atribuido por omissão e não herdado da tabela c_test;
A tabela Z_TEST só serviu para demonstrar o tablespace para qual por omissão os objectos são colocados.

 

PS: Estou ligado como SYSDBA e isto não é uma BD de Produção. Aconselha-se o uso de outros tablespaces para colocar objectos 😉

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s