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
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 CREATE TABLE TEST02 AS SELECT * FROM TEST01;
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
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
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.
Partager