102 votes

Comment puis-je supprimer une contrainte "not null" dans Oracle lorsque je ne connais pas le nom de la contrainte ?

J'ai une base de données qui a une contrainte NOT NULL sur un champ, et je veux supprimer cette contrainte. Le facteur de complication est que cette contrainte a un nom défini par le système, et que le nom de cette contrainte diffère entre le serveur de production, le serveur d'intégration et les différentes bases de données des développeurs. Notre processus actuel consiste à enregistrer des scripts de modification et une tâche automatisée exécute les requêtes appropriées via sqlplus sur la base de données cible. Je préférerais donc une solution qui pourrait être envoyée directement dans sqlplus.

Sur ma propre base de données, le SQL pour faire tomber ceci serait :

alter table MYTABLE drop constraint SYS_C0044566

Je peux voir la contrainte lorsque j'interroge le fichier all_constraints vue :

select * from all_constraints where table_name = 'MYTABLE'

mais je ne suis pas sûr de savoir comment travailler avec les SEARCH_CONDITION 's LONG ou la meilleure façon de supprimer dynamiquement la contrainte recherchée, même si je connais son nom.

Donc, comment puis-je créer une modification script qui peut faire tomber cette contrainte en fonction de ce qu'elle est, plutôt que de son nom ?


EDIT : La réponse de @Allan est bonne, mais je crains (en raison de mon manque d'expertise d'Oracle) qu'il ne soit pas universellement vrai que toute contrainte qui pourrait avoir un nom généré par le système sera associée à un moyen de supprimer la contrainte sans avoir à connaître son nom. Est-il vrai qu'il y aura toujours un moyen d'éviter d'avoir à connaître le nom d'une contrainte générée par le système lors de la suppression logique de cette contrainte ?

3 votes

Juste pour satisfaire votre curiosité : La contrainte NOT NULL est la uniquement type de contrainte dans Oracle que vous pouvez supprimer sans avoir besoin de connaître le nom de la contrainte. Pour tous les autres types de contraintes, vous devez connaître le nom de la contrainte.

207voto

Allan Points 7800
alter table MYTABLE modify (MYCOLUMN null);

Dans Oracle, les contraintes not null sont créées automatiquement lorsque not null est spécifié pour une colonne. De même, elles sont supprimées automatiquement lorsque la colonne est modifiée pour autoriser les valeurs nulles.

Clarification de la question révisée : Cette solution ne s'applique qu'aux contraintes créées pour les colonnes "not null". Si vous spécifiez "Primary Key" ou une contrainte de contrôle dans la définition de la colonne sans la nommer, vous vous retrouverez avec un nom généré par le système pour la contrainte (et l'index, pour la clé primaire). Dans ce cas, vous devez connaître le nom pour le supprimer. Le meilleur conseil est d'éviter ce scénario en veillant à spécifier un nom pour toutes les contraintes autre que "not null". Si vous vous trouvez dans une situation où vous devez supprimer une de ces contraintes de manière générique, vous devrez probablement recourir à PL/SQL et aux tables de définition de données.

1 votes

Cela semble vraiment trop beau pour être vrai, mais cela permet de traiter mon cas actuel et c'est tout simplement simple ! Existe-t-il des cas dans oracle où le nom de la contrainte pourrait être généré par le système mais où le sql ne pourrait pas être écrit pour éviter le nom de la contrainte de cette manière ?

1 votes

Merci... il s'avère que not null Les contraintes sont les seuls noms de système dans mon schéma qui sont susceptibles de m'affecter de cette manière.

23voto

vasanth Points 41

Essayez :

alter table <your table> modify <column name> null;

1voto

Mary C Points 46

N'oubliez pas que si le champ que vous souhaitez rendre nul fait partie d'une clé primaire, vous ne pouvez pas le faire. Les clés primaires ne peuvent pas avoir de champs nuls.

0voto

CaduMaciel Points 1

J'étais confronté au même problème en essayant de contourner une contrainte de contrôle personnalisée que je devais mettre à jour pour autoriser différentes valeurs. Le problème est que ALL_CONSTRAINTS ne permet pas de savoir à quelle colonne la ou les contraintes sont appliquées. J'ai réussi à le faire en interrogeant ALL_CONS_COLUMNS, puis en supprimant chacune des contraintes par son nom et en la recréant.

sélectionnez nom_contraint de toutes les_cons_colonnes où table_name = [TABLE_NAME] et column_name = [COLUMN_NAME]. et column_name = [COLUMN_NAME] ;

0voto

Guentersniden Points 76

Pour découvrir les contraintes utilisées, utilisez le code ci-dessous :

-- Set the long data type for display purposes to 500000.

SET LONG 500000

-- Define a session scope variable.

VARIABLE output CLOB

-- Query the table definition through the <code>DBMS_METADATA</code> package.

SELECT dbms_metadata.get_ddl('TABLE','[Table Described]') INTO :output FROM dual;

Cela montre essentiellement une déclaration de création pour la façon dont la table référencée est faite. En sachant comment la table est créée, vous pouvez voir toutes les contraintes de la table.

Réponse extraite du blog de Michael McLaughlin : http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/ De son cours de conception de base de données I.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X