8 votes

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

J'ai un tableau qui ressemble à ceci :

Number  | Name 
--------+--------
123     | Robert

C'est ce que je veux faire :

Si le numéro figure déjà dans la base de données, n'insérez pas de nouvel enregistrement.

Si le numéro n'est pas dans la base de données, mais que le nom l'est, créez un nouveau nom et insérez-le. Par exemple, si j'ai un enregistrement qui contient 123 pour Number y Bob pour Name Je ne veux pas l'insérer, mais si j'obtiens un enregistrement qui contient 456 pour Number y Robert pour name j'insérerais 456 y Robert1 . J'allais vérifier s'il y avait des doublons individuellement comme :

SELECT * FROM Person where Number = 123;

//If number is not found
SELECT * FROM Person where Name = 'Robert';

//If name is found, add a number to it.

Existe-t-il un moyen de combiner les deux déclarations ?

9voto

John Woo Points 132738

Votre question pose en fait deux problèmes. Le premier problème est de faire Number unique et la seconde consiste à incrémenter la colonne Name en ajoutant un numéro s'il existe déjà.

PREMIÈRE PARTIE

Puisque le nombre est UNIQUE , faire appliquer un UNIQUE sur la colonne. Il peut s'agir d'une PRIMARY KEY ou un UNIQUE KEY .

Si la colonne n'a pas de KEY et vous voulez le faire PRIMARY , voici le ALTER déclaration :

ALTER TABLE TableName ADD CONSTRAINT tb_pk PRIMARY KEY (Number)

mais si vous voulez seulement qu'il soit UNIQUE et non une clé primaire,

ALTER TABLE TableName ADD CONSTRAINT tb_uq UNIQUE (Number)

DEUXIÈME PARTIE

Vous pouvez en fait le faire sans utiliser la jointure.

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%'

Quelques détails :

lorsque la valeur fournie dans la colonne Number existe déjà, il y aura une erreur puisque la colonne est unique. J'ai lu un commentaire d'un message supprimé disant : " Le numéro n'est pas unique, mais s'il existe, je ne veux pas entrer un enregistrement." -- cela n'a pas de sens si vous ne voulez pas ajouter unicité sur la colonne. Comment savoir si le numéro existe déjà ou non ? En vérifiant l'existence de Number Je trouve que c'est un peu trop pour moi. Ma meilleure recommandation est donc d'imposer l'unicité.

1voto

Kobus Post Points 103
SELECT * FROM Person WHERE Number = 123 OR Name = 'Robert'

Je n'ai pas travaillé avec SQL depuis un certain temps, il se peut donc que ce soit faux ;)

Edita:

$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";
}

1voto

ahoo Points 841

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

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 1=1
where Not Exists (select * from Person where Number=123)

NOTE : si Robert existe dans la table, la requête ci-dessus insère Robert1 . si Robert1 existe, il insère Robert2 et ainsi de suite.

1voto

user2015144 Points 515

Faire en sorte que le numéro et le nom soient uniques.

   ALTER TABLE  `person` ADD UNIQUE (`number` ,`name`); 

Vous pouvez maintenant faire une insertion avec ON DUPLICATE

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

Pour ajouter un nombre après le nom, je suggérerais plutôt d'utiliser la colonne d'incrémentation automatique.

0voto

hai Points 101
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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X