8
votes

Combinez deux requêtes pour vérifier les doublons dans MySQL?

J'ai une table qui ressemble à ceci: xxx

C'est ce que je veux faire:

Si le numéro est déjà dans la base de données, ne le faites pas Insérez un nouvel enregistrement.

Si le numéro n'est pas dans la base de données, mais le nom est, créez un nouveau nom et insérez-le. Donc, par exemple, si j'ai un enregistrement contenant 123 pour numéro et bob pour nom , je n'ai pas " t envie d'insérer, mais si je reçois un enregistrement contenant 456 pour numéro et robert pour nom , J'insérerais 456 et robert1 . J'allais vérifier les doublons individuellement comme: xxx

existe une manière que je peux combiner les deux déclarations?


0 commentaires

5 Réponses :


1
votes
$number = 123;
$name = 'Robert';
$query = mysql_query("SELECT * FROM Person WHERE Number = $number OR Name = '$name' ");

if (mysql_num_rows($query) == 0 ) {
//-> Add your record, it's unused
} else if (mysql_result($query, 0, 'number') == $number && mysql_result($query, 0, 'name' == $name)) {
//combination of number and name already exists -> modify name and add record
} else {
echo "Number is used by another name";
}

2 commentaires

Existe-t-il un moyen de ne le retourner que si un nombre que si le nombre n'existe pas, je ne veux fondamiquement pas faire un ou, mais je veux toujours obtenir le nom même si le nombre n'existe pas, alors si je fais un Requête comme Sélectionnez * de la personne où numéro = 123 et nom = 'Bob' , cela ne renverrait rien, mais je ne veux pas cela, je veux toujours retourner un enregistrement avec le nom.


Je pense que cela fait ce que vous voulez. Numéro de $ = 123; $ nom = 'robert'; $ Query = mysql_query ("Select * de la personne où numéro = $ numéro ou nom = '$ nom'"); Si (mysql_num_rows ($ requête) == 0) {// -> Ajoutez votre dossier, c'est inutilisé} else {if (MySQL_RESULT ($ requis, 0, 'numéro') == $ Numéro && mysql_result ($ requérant, 0, 'Nom' == NAOM $)) {// Combinaison de numéro et nom existe déjà -> Modifier le nom et ajouter un enregistrement} else {else}} {ECHO "Number est utilisé par un autre nom"; }}



1
votes

Utilisez cette requête, pour insérer la ligne [123, 'robert'] . Si vous souhaitez insérer d'autres valeurs, changez 123 & Robert Valeurs dans la requête ci-dessous: xxx

note : Si robert existe dans la table, au-dessus des insertions de requête robert1 . Si robert1 existe, il insère robert2 , et ainsi de suite.


2 commentaires

"Je pense que ma réponse est la meilleure, alors je donne la prime à moi-même." - une réponse supprimée du tien. Avez-vous pensé à la performance?


@Jw 웃, ma réponse convient lorsque nous ne voulons pas appliquer une contrainte sur la colonne. Parce que le questionneur @xAaisoft, n'a pas dit de contrainte unique .



9
votes

Il y a en fait deux problèmes dans votre question. Le premier problème est de créer une colonne code> unique code> unique et le second consiste à incrémenter la colonne nom code> en ajoutant un numéro si elle existe déjà.

première partie strong> p>

puisque le numéro est code> unique code>, appliquer une contrainte code> unique code> sur la colonne. Il pourrait s'agir d'une clé primaire code> ou d'une clé unique code>. P>

si la colonne n'a aucune touche code> et que vous voulez faire IT primaire code>, voici le alter code> instruction: p> xxx pré>

  • Démo SQLFIDDLE LI> ul>

    mais si vous voulez seulement que ce soit unique code> et non une clé primaire, P>

    INSERT INTO TableName(Number, Name)
    SELECT  124 AS Number, 
            CONCAT('Robert', COALESCE(MAX(CAST(REPLACE(Name, 'Robert', '0') AS UNSIGNED)) + 1,'')) AS Name
    FROM    TableName
    WHERE   Name LIKE 'Robert%'
    
    • SQLFIDDLE Demo LI> ul>

      deuxième partie forte> p>

      Vous pouvez réellement le faire sans utiliser JOIN. P>

      ALTER TABLE TableName ADD CONSTRAINT tb_uq UNIQUE (Number)
      


6 commentaires

@ J.w. Au moins, donnez-nous quelque temps pour penser: P, car votre réponse est si parfaite que nous ne pouvons pas penser à une autre meilleure réponse. Entre, laissez-moi vous connecter avec vous f.b. :)


Lorsque j'insérer rober au lieu de robert , votre erreur de requête Erreur: troncature de données: troncature incorrecte de la valeur inteer: '0t' , tandis que le rober est nouveau Nom et valide.


La deuxième partie est vraiment incroyable :) +1


juste une chose mineure ... je pense que vous devriez utiliser où nom rlestituer '^ robert [0-9] * $' ou quelque chose comme ça


Supposez que j'ai d'abord inséré une ligne avec nom: abab dans la table. Après avoir inséré AB , votre requête insérera réellement AB1 au lieu de AB , tandis que ab n'est pas existant dans la table avant.


@fthiella tu as raison! Je viens de tester votre suggestion et ça fonctionnait totalement! SQLFIDDLE.com/#!2/1C0B5/1



1
votes

Créez à la fois le numéro et le nom unique.

INSERT INTO `person` (`number`, `name`, `id`) VALUES ('322', 'robert', 'NULL')       ON DUPLICATE  KEY UPDATE `id`='NULL';


0 commentaires

0
votes
insert into Person (Number,Name)
select 123, IF(mn.MaxNumber is NULL,'Robert',concat('Robert',mn.MaxNumber+1))
from (SELECT 'foo') foo
left JOIN (select max(CONVERT(SUBSTR(Name,LENGTH('Robert')+1),UNSIGNED)) `MaxNumber`
            from person where name rlike '^Robert[0-9]*$') mn on true
where Not Exists (select * from Person where Number=123)

0 commentaires