Créer de contrainte dans l'instruction alter table sans vérifier les données existantes
Je suis en train de créer une contrainte sur la OE.PRODUCT_INFORMATION table qui est livré avec Oracle 11g R2.
La contrainte doit faire l' PRODUIT_NOM unique.
Je l'ai essayé avec la déclaration suivante:
ALTER TABLE PRODUCT_INFORMATION
ADD CONSTRAINT PRINF_NAME_UNIQUE UNIQUE (PRODUCT_NAME);
Le problème c'est que dans les OE.PRODUCT_INFORMATION il y a déjà des noms de produits qui existent actuellement plus de deux fois.
L'exécution du code ci-dessus lance l'erreur suivante:
an alter table validating constraint failed because the table has
duplicate key values.
Est-il possible qu'une nouvelle contrainte ne sont pas utilisées sur la table existante de données?
J'ai déjà essayé le DISABLED
mot-clé. Mais quand j'active la contrainte puis je recevoir le même message d'erreur.
Votre question n'est pas claire. Que demandez-vous? Si vous avez des doublons dans une colonne, vous ne pouvez pas appliquer une contrainte d'unicité. Vous devez d'abord supprimer les doublons avant, puis en les ajoutant à votre contrainte.
Je vous remercie. C'était en fait la question à savoir si il existe un moyen de créer (via alter table) une contrainte sans vérifier les données existantes.
en fait, il est possible d'avoir une contrainte d'unicité sur une colonne avec des valeurs en double dans...
nice thread nécromancie, mais vous êtes deux ans de retard! Voir jonearles' commentaire et un lien sur ma réponse
Je voudrais le mettre à jour votre réponse, puis, parce que ce Q est en train d'être référencés.
Je vous remercie. C'était en fait la question à savoir si il existe un moyen de créer (via alter table) une contrainte sans vérifier les données existantes.
en fait, il est possible d'avoir une contrainte d'unicité sur une colonne avec des valeurs en double dans...
nice thread nécromancie, mais vous êtes deux ans de retard! Voir jonearles' commentaire et un lien sur ma réponse
Je voudrais le mettre à jour votre réponse, puis, parce que ce Q est en train d'être référencés.
OriginalL'auteur mhmpl | 2011-11-03
Vous devez vous connecter pour publier un commentaire.
Si vous êtes à la recherche d'appliquer une sorte de singularité pour toutes les futures entrées tout en gardant votre actuelle des doublons, vous ne pouvez pas utiliser une contrainte UNIQUE.
Vous pouvez utiliser un trigger sur la table pour vérifier la valeur insérée à contre-courant des valeurs de la table et si elle existe déjà, à en prévenir l'insérer.
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm
ou vous pouvez simplement supprimer les valeurs en double et puis enfoce votre contrainte UNIQUE.
EDIT: Après Jonearles et Jeffrey Kemp commentaires, j'ajouterai que vous pouvez réellement permettre une contrainte unique sur un tableau avec des valeurs en double présenter à l'aide de la
NOVALIDATE
clause mais vous pourriez ne pas être en mesure d'avoir un index unique sur qui pesaient sur la colonne.Voir Tom Kyte l'explication de ici.
Cependant, je tiens encore à vous soucier de la façon évidente l'intention était de le futur, les personnes qui ont à l'appui de la base de données. À partir d'un point de vue du support, il sera plus évident pour supprimer les doublons ou utiliser le déclencheur pour faire de votre intention claire.
YMMV
Jonearles, merci pour cette remarque, je n'y avais pas pensé!(+1) Mon seul souci serait dans le soutien de la contrainte. Toute nouvelle personne qui soutient l'DB serait de savoir d'ou ils pourraient rencontrer des problèmes. Avec le déclencheur, il est évident que ce qui est happning (même si un peu moins élégant).
OriginalL'auteur Ollie
Vous pouvez certainement créer une contrainte qui permettra de valider tout nouvellement insérée ou mise à jour des enregistrements, mais qui ne seront pas validés par rapport aux anciennes données existantes, à l'aide de la
NOVALIDATE
mot-clé, par exemple:Si il n'y a pas d'index sur la colonne, cette commande va créer un index non unique sur la colonne.
OriginalL'auteur Jeffrey Kemp
Vous pouvez utiliser reportable .
Le report de la contrainte seule diffère la validation jusqu'à sa validation. Ce ne sera pas vous aider si vous voulez que les données à insérer/mis à jour et validées.
OriginalL'auteur Judy Wang