1
votes

Vérifier les enregistrements dupliqués dans une table

J'ai un tableau contenant les informations de l'utilisateur, y compris le SSN. Maintenant, je dois écrire une requête pour empêcher, ou pour vérifier, quand il y a une personne qui commence à insérer un nouvel enregistrement dans la table, si le SSN des nouveaux enregistrements est le même avec quelqu'un qui est actuellement dans le système, alors il renvoie faux , ou rejetez l'insertion.

Je sais comment compter le même SSN dans une table, mais c'est en quelque sorte avant la vérification d'insertion, dois-je le faire au niveau frontal?

Mise à jour: Donc, je repense à ceci, je demande comment puis-je réellement autoriser l'insertion, et aussi chaque fois que nous faisons l'insertion, il y aura une vérification, si le nouvel insert a un SSN en double avec l'un des notre client actuel, alors il y aura une nouvelle colonne appelée "DuplicatedSSN" = True. Comment puis-je atteindre cet objectif?

sql

5 commentaires

La seule façon appropriée de faire cela est de créer une contrainte UNIQUE sur le champ SSN. Une fois que cela est en place, les tentatives d ' INSÉRER les doublons échoueront, ce que votre application peut vérifier.


Vous pouvez également gérer une liste des SSN actuels et si le nouveau SSN ne figure pas dans la liste, acceptez la valeur sinon rejetez-le.


@AlexHowansky merci, mais que se passe-t-il si je n'ai pas créé cette contrainte UNIQUE et que je veux en quelque sorte capturer cette personne, car pour une raison quelconque, il s'agit d'une application liée aux avantages, les personnes qui entrent deux fois dans leur SSN peuvent être considérées comme une fraude , nous devons donc écrire leur nom. Ce qui signifie que nous écrirons leur enregistrement dans l'application, mais pas complètement. Mais je pense que votre réponse est excellente. Je n'ai pas assez bien résumé ma question.


Vous voulez toujours une contrainte unique. Si vous voulez savoir quand une duplication est tentée, c'est facile, il suffit de vérifier si une insertion a échoué - ce que vous devriez faire de toute façon. Ensuite, agissez en conséquence - envoyez les données dans un fichier journal, insérez-les dans une autre table, peu importe. NE vous fiez PAS aux résultats d'un SELECT pour déterminer l'unicité.


J'ai donné deux options dans ma réponse. 1) Rendre la colonne unique. 2) Utilisez la logique INSERT IGNORE ON DUPLICATE KEY, ou 3) Utilisez SELECT puis INSERT s'il n'existe pas.


3 Réponses :


0
votes

Alex a raison ici. Une contrainte UNIQUE empêchera les entrées en double dans votre base de données. Afin d'ajouter la contrainte, vous devrez vous assurer qu'il n'y a pas de doublons dans votre table. Pour ajouter la contrainte, vous pouvez utiliser quelque chose comme le suivant

INSERT INTO table 1 (SSN, DuplicatedSSN) VALUES (999-99-9999, CASE WHEN EXISTS (SELECT ID FROM orders where SSN = '999-99-9999') THEN 1 ELSE 0 END)

Si vous souhaitez simplement définir un champ basé sur des informations existantes, je pense que vous pouvez utiliser une déclaration de cas dans votre insertion. P >

ALTER TABLE table1 ADD UNIQUE (SSN)


1 commentaires

Cela indique à l'OP comment rendre la colonne unique, mais ne résout pas réellement leur problème de s'assurer que le SSN n'existe pas avant l'insertion. Bien sûr, l'insert échouera s'il existe déjà à cause de l'UNIQUE, mais cela ne résout pas leur question.



0
votes

Étape 1 (DB): ajoutez une contrainte UNIQUE à la table pour éviter les doublons.

Étape 2 (programme): faites une pré-vérification par rapport à la valeur et exécutez votre code à partir de là.

Le pseudocode ressemblerait à:

SELECT COUNT(*) LINES FROM MAIN_TABLE WHERE SSN = $attempted_entry
if(LINES <= 0){
    --insert into MAIN_TABLE
} else {
    --insert into POSSIBLE_FRAUD_CHECKS
}


3 commentaires

Il n'y a pas besoin de pré-contrôle. Interceptez simplement l'insert défectueux sur la table principale.


peut-être, mais cela suppose que le seul type d'insertion échouée est sur un duplicata SSN. Il ressort de la situation initiale que cette possibilité exacte est la SEULE fois où il veut rediriger la tentative vers une cause possible de «fraude».


Aucune hypothèse de ce type, le pilote de base de données disposera d'un mécanisme pour vérifier le type d'erreur.



0
votes

J'espère que vous cryptez les informations SSN, mais voici comment vérifier s'il y a déjà un doublon. Il y a plusieurs façons.

Tout d'abord, vous devez faire en sorte que la colonne de base de données pour SSN ait une valeur «UNIQUE». Cela évitera qu'il n'y ait jamais de doublon.

Avec votre requête, vous devez faire ce qui suit:

INSERT INTO table (columns) VALUES (values)

En gros, cela dit ... 1) INSÉRER les valeurs dans le tableau 2) MAIS si le ssn existe déjà ... 3) Mettez à jour le ssn existant en = ssn (alias ne rien faire)

Cela n'insérera une nouvelle colonne que si elle n'existe pas déjà, mais la colonne SSN DOIT être une colonne UNIQUE!

Vous pouvez aussi faire ...

SELECT id FROM table WHERE ssn = ssn_value

si cela renvoie une ligne ... vous savez qu'elle existe ...

si rien n'existe. ..

INSERT IGNORE INTO table (column1, column2, etc, ssn_column)
VALUES (column1_value, column2_value, etc_value, ssn_value)
ON DUPLICATE KEY UPDATE ssn_column=ssn_column


2 commentaires

Ne vous fiez jamais à un SELECT pour déterminer si un INSERT ultérieur fonctionnera.


Ouais, c'est pourquoi mon premier est INSERT IGNORE ON DUPLICATE KEY et demande à l'OP de créer d'abord une colonne UNIQUE - de cette façon, il n'y aura jamais de SSN en double, quoi qu'il arrive.