CREATE TABLE AS SELECT : Foreign Key pas reprise?
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:
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:
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:
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:
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. |