J'ai une table qui ressemble à ceci: C'est ce que je veux faire: p> Si le numéro est déjà dans la base de données, ne le faites pas Insérez un nouvel enregistrement. p> 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 existe une manière que je peux combiner les deux déclarations? P> P> 123 code> pour numéro code> et bob code> pour nom code>, je n'ai pas " t envie d'insérer, mais si je reçois un enregistrement contenant 456 code> pour numéro code> et robert code> pour nom code>, J'insérerais 456 code> et robert1 code>. J'allais vérifier les doublons individuellement comme: p>
5 Réponses :
$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";
}
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' code>, 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"; }}
Utilisez cette requête, pour insérer la ligne note em>: Si [123, 'robert'] code>. Si vous souhaitez insérer d'autres valeurs, changez 123 code> & Robert code> Valeurs dans la requête ci-dessous: robert code> existe dans la table, au-dessus des insertions de requête robert1 code>. Si robert1 code> existe, il insère robert2 code>, et ainsi de suite. p> p>
"Je pense que ma réponse est la meilleure, alors je donne la prime à moi-même." I> - 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 code> code> sur la colonne. Parce que le questionneur @xAaisoft, n'a pas dit de contrainte unique code>.
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 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 mais si vous voulez seulement que ce soit Vous pouvez réellement le faire sans utiliser JOIN. P> Certains détails: p> Lorsque la valeur fournie sur la colonne nom code> en ajoutant un numéro si elle existe déjà. primaire code>, voici le alter code> instruction: p>
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%'
ALTER TABLE TableName ADD CONSTRAINT tb_uq UNIQUE (Number)
numéro code> existe déjà, il lancera une erreur car la colonne est unique. J'ai lu un commentaire d'un message supprimé en disant: ". Sense si vous ne voulez pas ajouter unicité em> sur la colonne. Comment saurez-vous si le numéro existe déjà ou non? Faire un peu de vérification de l'existence de numéro code> ressemble à un peu de frais généraux pour moi. Donc, ma meilleure recommandation est de faire respecter l'unicité. P> p>
@ J.w. Au moins, donnez-nous quelque temps b> 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. B> :)
Lorsque j'insérer rober code> au lieu de robert code>, votre erreur de requête Erreur: troncature de données: troncature incorrecte de la valeur inteer: '0t' code>, 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] * $' code> ou quelque chose comme ça
Supposez que j'ai d'abord inséré une ligne avec nom: abab code> dans la table. Après avoir inséré AB code>, votre requête insérera réellement AB1 code> au lieu de AB code>, tandis que ab code> 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
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';
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)