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?
Répondre
Vous pouvez le faire en utilisant PERMETTRE NOVALIDATE état de contrainte, mais la suppression est de façon beaucoup plus préféré.
Vous devez configurer vos enregistrements directement avant d'ajouter les contraintes.
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
- Vous ne supprimez la ligne avec clé partielle 0
- 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
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)
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.
- 1. récursive CVS ajouter des fichiers/répertoires et ignorer les fichiers existants CVS
- 2. Assistants de base de données T4 existants pour la récupération de schéma DB
- 3. Quelle ligne de l'ensemble de données enfreint la contrainte unique DB?
- 4. Ignorer; et ajouter à la table de données
- 5. transfering MySQL Les enregistrements de base de données à la base de données
- 6. SQL Import ignorer les doublons
- 7. XSD DataSets et ignorer les clés étrangères
- 8. postgres: vérification de la contrainte et les valeurs nulles
- 9. Les emplacements existants Qt4 ne sont pas reconnus
- 10. iphone - Les enregistrements SQLite sur la table ne viennent pas?
- 11. Linq2SQL et les enregistrements en double
- 12. Stratégies pour émettre des enregistrements uniques via db?
- 13. DB Performance et types de données
- 14. rails versionnés db et diffèrent
- 15. Comment extraire les enregistrements et tous les enregistrements enfants dans une base de données dans les entités ADO.NET?
- 16. requête SQL pour afficher les données db
- 17. Comment insérer de nouvelles entrées dans une table Access db via un site Web ASP.net?
- 18. Quelle conception de base de données est la plus rapide: un index unique et INSERT IGNORE, ou en utilisant SELECT pour trouver des enregistrements existants?
- 19. SQLCE - Ignorer l'exécution de la requête
- 20. SQL - comment vérifier la table pour de nouvelles données?
- 21. Dans LINQ, quelle est la principale différence/utilité entre .Any <> et .Where <> pour tester les enregistrements existants
- 22. Récupérer toutes les nouvelles et tous les commentaires
- 23. contrainte de vérification sur la table recherche
- 24. Bonne nouvelles RSS feed pour les nouvelles JavaFX et des ressources
- 25. plusieurs connexions db par rapport à db centralisé/redondant
- 26. vérification de contrainte différée
- 27. Mise à jour d'une collection à db
- 28. Liaison de données, jeu de données avec données de données et rafraîchissement de DataTable unique à partir de DB
- 29. contrainte altérant supprimer l'action
- 30. Sélectionner les informations de la colonne et joindre avec l'information de la contrainte
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
Juste parceque le manque de spécifications de conception. Cela devrait exister au début mais nous avons réalisé maintenant. – erdogany
jusqu'à présent, il semble que les moteurs de DB n'aiment pas cela :) – erdogany