2010-12-16 158 views
3

Je veux désactiver les contraintes NOT NULL dans une table pour insérer des données pour le test, mais je ne peux pas trouver un moyen de désactiver les contraintes sans nom.Existe-t-il un moyen pour désactiver/activer une contrainte sans nom?

J'ai trouvé suffisamment d'informations pour désactiver les contraintes nommées, mais je n'ai pas trouvé d'exemple pour désactiver la contrainte NOT NULL non nommée.

Je voudrais implémenter cela sans interroger le dictionnaire de données, mais ... Je suis prêt à le faire si c'est le seul moyen. Mais je voudrais utiliser un ALTER TABLE DDL propre.

+0

Techniquement il n'y a pas une telle chose comme une « contrainte sans nom » dans Oracle. Ce qui est difficile, c'est que si vous ne le nommez pas vous-même, Oracle lui donne un nom - qui variera d'une instance à l'autre. C'est pourquoi je nomme toujours toutes les contraintes, à l'exception des contraintes 'NOT NULL' (qui n'ont jamais besoin d'être nommées explicitement). –

+0

Vous avez raison Jeffrey, merci pour le commentaire. Je parlais de contraintes qui ont un nom généré par la base de données et non créé par l'utilisateur. – im8bit

Répondre

4

Vous aurez besoin d'interroger le dictionnaire de données, quelque chose comme cela va désactiver toutes les contraintes sur la table. Sachez cependant que cela désactivera le système de contraintes, pas seulement pour votre session. Peut-être que vous voulez vraiment différer la contrainte?

drop table testxx 

drop table testxx succeeded. 
create table testxx (id number not null) 

create table succeeded. 
select status from user_constraints where table_name = 'TESTXX' 

STATUS 
-------- 
ENABLED 

1 rows selected 

begin 
for cnames in (select table_name,constraint_name from user_constraints where table_name = 'TESTXX') loop 
    execute immediate 'alter table ' || cnames.table_name || ' disable constraint ' || cnames.constraint_name; 
    end loop; 
end; 

anonymous block completed 
select status from user_constraints where table_name = 'TESTXX' 

STATUS 
-------- 
DISABLED 

1 rows selected 
+0

Merci Matthew, Il semble que l'interrogation du dictionnaire de données est la seule solution. Merci! – im8bit

5

Vous pouvez également modifier simplement la colonne comme suit

create table test_null (col_n number not null); 
alter table test_null modify col_n number null; 
+0

Merci Gary, ça peut marcher aussi, le problème que j'ai trouvé avec cette option est qu'il commet tout changement en attente à la table, et je cherchais vraiment à éviter cela. – im8bit