Comment puis-je déposer un “not null” contrainte dans Oracle quand je ne sais pas le nom de la contrainte?
J'ai une base de données qui a une contrainte not NULL sur un terrain, et je veux enlever cette contrainte. Le facteur de complication est que cette contrainte a un système de nom défini, et que la contrainte du nom diffère entre le serveur de production, serveur d'intégration, et les différents développeur de bases de données. Notre processus actuel est de vérifier dans un des scripts de modification, et une tâche automatisée exécute les requêtes appropriées par le biais de sqlplus contre la base de données cible, donc je préfère une solution qui pourrait tout simplement être envoyé directement dans sqlplus.
Sur ma propre base de données, le SQL de déposer ce serait:
alter table MYTABLE drop constraint SYS_C0044566
Je peux voir la contrainte lorsque j'ai une requête à la all_constraints
vue:
select * from all_constraints where table_name = 'MYTABLE'
mais je ne suis pas sûr de la façon de travailler avec les SEARCH_CONDITION
's LONG
type de données ou la meilleure façon de supprimer dynamiquement l'air-jusqu'contrainte, même après que je sais son nom.
Alors, comment puis-je créer un script de modification qui peuvent tomber cette contrainte basée sur ce qu'il est, plutôt que de connaître son nom?
EDIT:
@Allan réponse est bonne, mais je suis préoccupé (dans mon manque d'expertise Oracle) qu'il peut ne pas être universellement vrai que de toute contrainte qui pourrait avoir un nom généré par le système va être 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 à savoir un système de contrainte nommée du nom lorsque logiquement à la baisse que la contrainte?
- Simplement pour satisfaire votre curiosité: La contrainte not NULL est le seul type de contrainte dans Oracle que vous pouvez supprimer sans avoir besoin de connaître la contrainte du nom. Tous les autres types de contraintes, vous devez connaître le nom de la contrainte.
Vous devez vous connecter pour publier un commentaire.
Dans Oracle, les contraintes not null sont créés automatiquement lorsqu'il n'est pas 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.
La clarification de la version révisée de la question: Cette solution s'applique uniquement aux contraintes créées pour "not null" colonnes. Si vous spécifiez "Clé Primaire" ou une vérification de la contrainte 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 de la clé primaire). Dans ces cas, vous aurez besoin de connaître le nom de la faire tomber. Le meilleur conseil que l'on est pour éviter le scénario en vous assurant que vous spécifiez un nom pour toutes les contraintes autres que "not null". Si vous vous trouvez dans la situation où vous avez besoin de déplacer l'une de ces contraintes de façon générique, vous aurez probablement besoin de recourir à PL/SQL et la définition des données de tables.
not null
contraintes sont le seul système nommé dans mon schéma, qui, probablement, jamais me toucher de cette façon.Essayer:
Rappelez-vous juste, si le champ que vous voulez faire nullable est partie d'une clé primaire, vous ne pouvez pas.
Les Clés primaires ne peuvent pas avoir la valeur null dans les champs.
De découvrir toutes les contraintes, utilisez le code ci-dessous:
Essentiellement, cela montre une instruction 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 l'ensemble des contraintes de la table.
Répondre à des prises de Michael McLaughlin du blog: http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/ à Partir de sa Base de données de Conception que j'ai de la classe.
J'ai été confrontée au même problème en essayant de contourner une contrainte de validation personnalisée que j'avais besoin de mise à jour pour permettre à des valeurs différentes. Le problème est que ALL_CONSTRAINTS ne pas avoir un moyen de savoir de quelle colonne de la contrainte(s) sont appliqués. La façon dont j'ai réussi à faire c'est en interrogeant ALL_CONS_COLUMNS au lieu de cela, puis la suppression de chacune des contraintes par leur nom et de le recréer.
sélectionnez constraint_name
de all_cons_columns
où table_name = [NOM_TABLE]
et column_name = [COLUMN_NAME];