[MySQL] Melanger 2 tables

Edit: Dans mon cas “IGNORE” fait la l’affaire. Voir dernier message pour exemple simple.

Salut,
je cherche un moyen de mélanger 2 tables sachant qu’il y a des doublons.
Pour les détails:

J’ai un projet de site perso avec une petite base de données contenant mes dates de concerts:
aaaammjj groupe lieu
ex:
20150623 nirvana nimes
20150630 jellyroll bastia

Via une requète php, j’arrive à afficher le contenu de la base de données sur le site.

Je me suis ecris un programme type tableur qui gère mes dates et qui me permet de générer un ficher texte importable par mysql.
Ce programme compile bien pour ARM et je peux le faire tourner sur mon android.

Mon idée est de pouvoir mettre à jour la base de données du site à partir de différents supports (mon PC ou mon téléphone lors d’un déplacement).
Evidement, les données sur ces supports ne sont pas synchronisées:
Sur le PC et sur le serveur:
20150601 groupe1 lieu1
20150602 groupe2 lieu2

Sur le téléphone:
20150601 groupe1 lieu1
20150603 groupe3 lieu3

Si je mets à jour via le téléphone comment faire en sorte que le site intégre les 3 dates sans dupliquer la 1ere?
Y a t’il un moyen de comparer les entrées et de n’integrer que les nouvelles (sachant qu’il peut y avoir 2 dates par jour)? Via un script? Via une fonction mysql dediée?

Bien à vous.

Exemple:

delimiter | create procedure ins ( d int(1) ) begin delete from toto where c=d; insert into toto (c) values (d); end; | delimiter ;
où toto est une base d’exemple avec un champ c entier

create table toto as select 1 as c;

charge la procédure et fait des call ins(ce que tu veux).

Peux tu fournir la définition de ta table en SQL ? Ou du moins préciser quelle est sa clef primaire si elle en a une ?
Par défaut j’aurais tendance à dire que c’est le premier chiffre que tu donne pour chaque enregistrement.
Au passage, si tu ne sais pas ce qu’est une clef primaire : fr.wikipedia.org/wiki/Cl%C3%A9_primaire

EDIT :
Au pire tu peux aussi laisser des doublons dans ta table et créer une vue (table virtuelle calculée dynamiquement à partir des autres tables) ou les doublons n’apparaissent pas.
Par exemple avec la commande suivante :

EDIT 2 :
Autant pour moi, le premier chiffre de tes enregistrements étant la date du concert, ta clef primaire devrait être composée de tes 3 attributs.

Salut vous deux. Merci pour vos réponses.
Je ne me suis pas occupé de ce problème depuis un moment. Dernièrement je pofine plutôt mon programme C/GTK+ qui genere les fichiers textes en question.

Je n’ai pas de serveur mysql sous la main mais je vais remettre ça sur pied pour tester.

Pour répondre à Nemesis,
je n’ai pas de clé primaire. La raison est, si je me souviens bien, qu’elle me genait sans que j’arrive à comprendre son interêt.
Mon programme peut générer (aléatoirement), pour faire des tests, 30000+ entrées. De mémoire, la PK admet ~655xx valeurs non? Donc je saturais ma table rapidement avec mes tests.
Je me suis documenté dessus mais j’en ai déduis qu’elle me generait plus qu’autre chose. J’ai surement tord (tout le monde l’utilise) mais pour l’instant c’est ce que je pense.

Vos solutions sont semblables non? On recupère la table et sa mise à jour, on les mix et on exclut/supprime les doublons.

Il m’arrive d’avoir 2 dates le même jour avec le même groupe au même endroit…
Ca change la manière de définir un doublon, rien de gênant.

Bref, je vais essayer de faire ma sauce, avec vos indications, je devrait m’en sortir.

Pas tout à fait, la première insère sauf si l’entrée existe déjà, la deuxième se débrouille avec une table ayant des doublons en fabriquant une vue sans doublons.

Le mieux étant toujours de formuler une contrainte d’unicité…
Si tu ne veux pas le faire avec une clef primaire, tu peux toujours spécifier la contrainte directement : blog.sqlauthority.com/2014/01/11 … ing-table/

Salut,
j’ai pu tester la création d’une constrainte d’unicité composite (sur plusieurs colonnes).
J’ai un soucis, dû apparement au comportement normal de MySQL:
J’ai importé 57 gigs à partir d’un ancien fichier texte(que je conserve pour test). Entre temps, j’ai modifié mon programme pour qu’il n’exporte que les dates que je desire rendre publiques (via une checkbox dans mon tableau GTK). Je me retrouve avec un fichier texte contenant quelques dates qui sont déjà importées + les nouvelles dates.

(Ce que j’esperais: Que Mysql saute les dates déjà importées grâce à la fameuse contrainte et rajoute les nouvelles.)
Ce qui se passe: Mysql trouve une violation d’unicité à la première date et ne va pas plus loin.

Comme c’est parti, il va falloir que je fasse le tri comme fran.b le suggère? Via des commandes mysql? Je pensais que la contrainte d’unicité permettant de faire ça de manière sobre.

Ci dessous des complèments d’infos:

+---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | gigdate | date | NO | MUL | NULL | | | band | varchar(32) | YES | | NULL | | | place | varchar(32) | YES | | NULL | | | detail | varchar(32) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+

exemple d’une table mysql:

| 2013-09-11 | samena    | marseille           | ceolis au pharo.       |
| 2013-10-26 | banda     | rove                | fête de la chêvre      |

exemple d’un fichier à importer:

2013-9-11;samena;marseille;ceolis au pharo. 2013-9-13;ams;carombes; 2013-10-26;banda;rove;fête de la chêvre en soirée.

Dans cet exemple, il faudrait que mysql exclut la première entrée car doublon, inclut la 2ème (carombes), conserve la 3ème (chêvre) et rajoute la 4ème (chêvre soirée) puisque, même similaire à la 3ème, il s’agit de 2 “gig” différents (la colonne 4 est différente).

Si tu as mis une contrainte sur plusieurs colonnes, tu peux peut-être faire tes insertions avec ON DUPLICATE KEY UPDATE : dev.mysql.com/doc/refman/5.5/en … -keys.html

Du coup, il n’ignorerait pas le doublon mais ferait un UPDATE avec les mêmes valeurs.
À voir si ça fonctionne en pratique…

La solution était d’utiliser IGNORE. Tellement évident après coup.
J’avais peut être mal énoncé mon problème…

LOAD DATA INFILE '/chemin/vers/csv/Unamed.csv' IGNORE INTO TABLE gig FIELDS terminated by ';' LINES terminated by '\n' ;
MySQL ignorera les entrées ayant la même clé d’unicité (“replace” fera l’inverse).
Dans mon cas n’ayant pas de clé d’unicité mais une contrainte d’unicité (sur tout les champs), mysql considère 2 entrées identiques si TOUT les champs sont identiques. Donc 2 concerts le même jour seront considérés différents si au moins une entrée diffère. C’est que je voulais.

Encore merci.

[quote=“kna”]Si tu as mis une contrainte sur plusieurs colonnes, tu peux peut-être faire tes insertions avec ON DUPLICATE KEY UPDATE : dev.mysql.com/doc/refman/5.5/en … -keys.html

Du coup, il n’ignorerait pas le doublon mais ferait un UPDATE avec les mêmes valeurs.
À voir si ça fonctionne en pratique…[/quote]

Create View #nom_vue(#nom_attribut, #nom_attribut) As Select Distinct * From #nom_table;