web-dev-qa-db-fra.com

Comment 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 souhaite 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 diverses bases de données de développement. Notre processus actuel consiste à archiver les scripts de modification. Une tâche automatisée exécute les requêtes appropriées via sqlplus dans la base de données cible. Je préférerais donc une solution qui pourrait simplement être envoyée directement dans sqlplus.

Sur ma propre base de données, le SQL à supprimer serait le suivant:

alter table MYTABLE drop constraint SYS_C0044566

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

select * from all_constraints where table_name = 'MYTABLE'

mais je ne suis pas sûr de savoir comment travailler avec le type de données LONG de SEARCH_CONDITION ou comment supprimer de manière dynamique la contrainte recherchée même après que je connaisse son nom.

Alors, comment puis-je créer un script de changement qui peut supprimer cette contrainte en fonction de ce qu’il est plutôt que de son nom?


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

72
Chris Farmer
alter table MYTABLE modify (MYCOLUMN null);

Dans Oracle, les contraintes non NULL sont créées automatiquement lorsque non NULL est spécifié pour une colonne. De même, ils sont supprimés automatiquement lorsque la colonne est modifiée pour autoriser les valeurs NULL.

Clarifier la question révisée : Cette solution ne s'applique qu'aux contraintes créées pour les colonnes "non nulles". Si vous spécifiez "Clé primaire" ou une contrainte de vérification dans la définition de colonne sans la nommer, vous obtiendrez un nom généré par le système pour la contrainte (et l'index pour la clé primaire). Dans ces cas, vous devez connaître le nom pour le supprimer. Le meilleur conseil qui soit consiste à éviter le scénario en veillant à spécifier un nom pour toutes les contraintes autres que "non nul". Si vous vous trouvez dans la 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.

146
Allan

Essayer:

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

Rappelez-vous simplement que si le champ que vous voulez rendre Nullable fait partie d'une clé primaire, vous ne pouvez pas . Les clés primaires ne peuvent pas avoir de champs nuls.

1
Mary C

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 instruction create expliquant comment la table référencée est créée. En sachant comment la table est créée, vous pouvez voir toutes les contraintes de la table.

Réponse tirée du blog de Michael McLaughlin: http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/ De sa classe de conception de base de données I.

1
Guentersniden

Je rencontrais le même problème en essayant de contourner une contrainte de vérification personnalisée que je devais mettre à jour pour autoriser des valeurs différentes. Le problème est que ALL_CONSTRAINTS n’a pas de moyen de dire à quelle colonne la contrainte est appliquée. J'ai réussi à le faire en interrogeant ALL_CONS_COLUMNS à la place, en supprimant chacune des contraintes par leur nom et en les recréant.

sélectionnez nom_contrainte parmi toutes les colonnes_cons_ où nom_table = [NOM_Table] et nom_colonne = [NOM_COLUMN];

0
CaduMaciel