Hello les forumeurs,

J'ai créé une table avec des contraintes PK, UNIQUE, FK, CHECK et NOT NULL.
En faisant un CTAS (CREATE TABLE AS SELECT), je constate que les contraintes PK, UNIQUE et FK ne sont pas reprises. Seules sont reprises les contraintes CHECK et NOT NULL (sauf celle sur la PK).

En parcourant le net, il est dit que pour les contraintes PK et UNIQUE, c'est pour éviter d'avoir à créer automatiquement un index alors que le user n'en a peut-être pas besoin sur sa nouvelle table.
OK, mais il n'est rien dit sur l'absence de la reprise de la contrainte Foreign Key, savez-vous pourquoi?

Voici mon test.
Création de la table avec les contraintes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
SQL> CREATE TABLE TEST01 (
          ID NUMBER(5) CONSTRAINT PK_T01_ID PRIMARY KEY, 
          NOM VARCHAR2(50 CHAR) CONSTRAINT U_T01_NOM UNIQUE, 
          PRENOM VARCHAR2(50 CHAR) CONSTRAINT NN_PRENOM NOT NULL, 
          T_DEPTNO NUMBER(2) CONSTRAINT FK_T01_DEPT REFERENCES DEPT(DEPTNO), 
          HIRE_DATE DATE, CONSTRAINT CK_T01_HIREDATE CHECK(HIRE_DATE IS NOT NULL));
Table created.

CTAS sur la table TEST01
Code : Sélectionner tout - Visualiser dans une fenêtre à part
CREATE TABLE TEST02 AS SELECT * FROM TEST01;
Un desc montre que la contrainte NOT NULL sur la colonne PRENOM a bien été conservée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SQL> desc test01
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(5)
 NOM                                                VARCHAR2(50 CHAR)
 PRENOM                                    NOT NULL VARCHAR2(50 CHAR)
 T_DEPTNO                                           NUMBER(2)
 HIRE_DATE                                          DATE
 
SQL> desc test02
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(5)
 NOM                                                VARCHAR2(50 CHAR)
 PRENOM                                    NOT NULL VARCHAR2(50 CHAR)
 T_DEPTNO                                           NUMBER(2)
 HIRE_DATE                                          DATE
En revanche, dans USER_CONSTRAINTS, seule la contrainte CHECK sur HIREDATE a été reprise pour la table TEST02 : plus de PK, de UNIQUE, de FK...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
SQL> select table_name, constraint_name, constraint_type from user_constraints where table_name like 'TEST%' order by table_name, constraint_name;
 
TABLE_NAME                     CONSTRAINT_NAME                C
------------------------------ ------------------------------ -
TEST01                         CK_T01_HIREDATE                C
TEST01                         FK_T01_DEPT                    R
TEST01                         NN_PRENOM                      C
TEST01                         PK_T01_ID                      P
TEST01                         U_T01_NOM                      U
TEST02                         SYS_C008585                    C
6 rows selected.