2009-01-26 4 views
1

Je veux apprendre la réponse pour différents moteurs de DB mais dans notre cas; Nous avons des enregistrements qui ne sont pas uniques pour une colonne et nous voulons maintenant rendre cette colonne unique, ce qui nous oblige à supprimer les doublons. Nous utilisons Oracle 10g. Est-ce raisonnable? Ou est-ce quelque chose comme la déclaration de goto :)? Devrions-nous vraiment supprimer? Et si nous avions des millions de disques?La contrainte DB peut-elle ignorer les enregistrements existants et ne s'appliquer qu'aux nouvelles données?

+0

Juste curieux de savoir pourquoi vous voudriez imposer l'unicité pour les nouveaux enregistrements seulement? Je suppose qu'il y a une bonne raison pour laquelle vous voudriez l'unicité dans une colonne qui auparavant n'appliquait pas l'unicité? – RobS

+0

Juste parceque le manque de spécifications de conception. Cela devrait exister au début mais nous avons réalisé maintenant. – erdogany

+0

jusqu'à présent, il semble que les moteurs de DB n'aiment pas cela :) – erdogany

Répondre

1

Vous pouvez le faire en utilisant PERMETTRE NOVALIDATE état de contrainte, mais la suppression est de façon beaucoup plus préféré.

+0

est-ce pour Oracle? – erdogany

+0

Oui, DDL est quelque chose comme ALTER TABLE [votre_table] MODIFIER CONSTRAINT [votre_contraint] ACTIVER NOVALIDATE – user57697

+0

Ou ALTER TABLE ... ADD CONTRAINT ... ACTIVER NOVALIDATE si vous ajoutez une nouvelle contrainte. – user57697

1

Vous devez configurer vos enregistrements directement avant d'ajouter les contraintes.

2

Pour répondre à la question posée: Non, cela ne peut être fait sur aucun RDBMS dont je suis au courant. Toutefois, comme la plupart des choses, vous pouvez contourner ce problème en procédant comme suit.

Créer une clé composite, avec une nouvelle colonne et la colonne existante

Vous pouvez le rendre unique sans rien supprimer en ajoutant une nouvelle colonne, appelez PartialKey.

Pour les lignes existantes, définissez PartialKey sur une valeur unique (en commençant par zéro).

Créez une contrainte unique sur la colonne existante et PartialKey (vous pouvez le faire car chacune de ces lignes sera désormais unique).

Pour les nouvelles lignes, utilisez uniquement une valeur par défaut de Zero pour PartialKey (car zéro a déjà été utilisé), ce qui force la colonne existante à avoir des valeurs uniques dans la table.

IMPORTANT EDIT

C'est faible - si vous supprimez une ligne avec la clé partielle 0. Maintenant, une autre ligne peut être ajouté avec une valeur qui est déjà dans la colonne existante, parce que le 0 à volonté clé partielle unicité de garantie.

Vous devez vous assurer que soit

  1. Vous ne supprimez la ligne avec clé partielle 0
  2. Vous avez toujours une ligne fictive avec 0 clé partielle, et vous ne supprimez (ou vous réinsérez immédiatement automatiquement)

Edit: mordre la balle et nettoyer les données

Si, comme vous l'avez dit, vous venez de réaliser que la colonne doit être unique, vous devez (si possible) nettoyer les données. L'approche ci-dessus est un hack, et vous vous retrouvez à écrire plus de hacks lors de l'accès à la table (vous pouvez trouver deux ensembles de logique pour gérer les requêtes sur cette table, un où la colonne est unique, et Ce n'est pas le cas, je le nettoierais maintenant ou il reviendra et vous mordra dans le cul mille fois plus

+0

semble intéressant. Un peu difficile mais nous considérons que – erdogany

+0

nous avons nettoyé les données, mais un tel cas peut être confronté à l'avenir, et bon de savoir un tel hack, merci – erdogany

2

Cela peut être fait dans SQL Server.

Lorsque vous créez une contrainte de vérification, vous pouvez définir une option pour l'appliquer soit de nouvelles données uniquement ou existantes données aussi bien. La possibilité d'appliquer la contrainte aux nouvelles données n'est utile lorsque vous savez que les données existantes rencontre déjà la nouvelle vérification contrainte, ou lorsqu'une règle d'affaires exige la contrainte à exécuter que de ce point en avant.

par exemple

ALTER TABLE myTable 
WITH NOCHECK 
ADD CONSTRAINT myConstraint CHECK (column > 100) 
0

Dans Oracle, vous pouvez placer une contrainte dans un état d'activation novalidate. Lorsqu'une contrainte est dans l'état enable novalidate, toutes les instructions suivantes sont vérifiées pour la conformité à la contrainte. Cependant, toutes les données existantes dans la table ne sont pas vérifiées. Une table avec des contraintes activées novalidated peut contenir des données non valides, mais il n'est pas possible d'y ajouter de nouvelles données non valides. L'activation des contraintes à l'état novalidé est particulièrement utile dans les configurations d'entrepôt de données qui téléchargent des données OLTP valides.

Questions connexes