Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
basededonnees:mysql [31/01/2015 18:21] julp [Insérer si inexistant sinon mettre à jour] |
basededonnees:mysql [22/03/2017 17:19] (Version actuelle) julp |
||
---|---|---|---|
Ligne 39: | Ligne 39: | ||
)</ | )</ | ||
C'est l'" | C'est l'" | ||
- | <code php>$out = str_replace(array(' | + | <code php>$out = str_replace(array(' |
+ | # ou, mieux : | ||
+ | $out = [' | ||
Par contre : ça revient éventuellement à " | Par contre : ça revient éventuellement à " | ||
Ligne 52: | Ligne 54: | ||
====== Les timezones et comment régler l' | ====== Les timezones et comment régler l' | ||
- | Sachez tout d' | + | Déplacé sur [[http://www.julp.fr/blog/posts/5-les-timezones-et-comment-regler-l-heure]] |
- | * TIMESTAMP | + | |
- | * DATETIME (comprend DATE et TIME) | + | |
- | + | ||
- | Ils diffèrent par ce qu'ils impliquent : | + | |
- | * le type TIMESTAMP est surtout destiné à son initialisation automatique (INSERT) et à sa mise à jour automatique lorsqu' | + | |
- | * le type DATETIME est bien moins limité (de ' | + | |
- | * le format TIMESTAMP est convertie de la timezone MySQL courante vers UTC à l' | + | |
- | + | ||
- | Après cette brève présentation des types date/heure, il est possible de modifier à la volée la timezone courante au lieu d' | + | |
- | * les importer prend peu de temps et de connaissances mais encore faut-il avoir les accès requis (en clair, sur du mutualisé, c'est tout bonnement impossible) | + | |
- | * pour travailler sur les timezones au niveau de MySQL, c'est obligatoire. Comment, sinon, gérez les heures d' | + | |
- | + | ||
- | Donc, pour importer ces fameuses timezones : | + | |
- | * sous Unixoïdes : | + | |
- | | + | |
- | - Relancer MySQL | + | |
- | * sous Windows : | + | |
- | - Arrêter le serveur MySQL s'il est lancé | + | |
- | - Se rendre sur http:// | + | |
- | - Télécharger le fichier qui correspond au lien //POSIX standard Time zone description tables, version 20XXn// | + | |
- | - Dézipper | + | |
- | - Redémarrer MySQL | + | |
- | + | ||
- | Tester que tout fonctionne : | + | |
- | < | + | |
- | Query OK, 0 rows affected (0.00 sec) | + | |
- | + | ||
- | mysql> select now(); | + | |
- | +---------------------+ | + | |
- | | now() | | + | |
- | +---------------------+ | + | |
- | | 2013-07-26 15:57:20 | | + | |
- | +---------------------+ | + | |
- | 1 row in set (0.00 sec) | + | |
- | + | ||
- | mysql> set time_zone = ' | + | |
- | Query OK, 0 rows affected (0.00 sec) | + | |
- | + | ||
- | mysql> select now(); | + | |
- | +---------------------+ | + | |
- | | now() | | + | |
- | +---------------------+ | + | |
- | | 2013-07-26 16:57:20 | | + | |
- | +---------------------+ | + | |
- | 1 row in set (0.00 sec)</ | + | |
- | + | ||
- | Quant à ceux qui ne peuvent que subir, tout ce que vous pouvez faire, c'est remplacer vos NOW() et autres fonctions MySQL par celles de votre langage. Par exemple, pour PHP, qui embarque toutes ces informations de fuseaux horaire, il suffira de faire un préalable '' | + | |
====== Optimisation : éviter des SELECT inutiles ====== | ====== Optimisation : éviter des SELECT inutiles ====== | ||
- | ===== Insérer ou ne rien faire si l' | + | Déplacé sur [[http://www.julp.fr/blog/posts/6-optimisation-eviter-des-select-inutiles]] |
- | + | ||
- | Si vous avez un élément " | + | |
- | + | ||
- | Pour l' | + | |
- | <code sql> | + | |
- | `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, | + | |
- | `login` VARCHAR(80) NOT NULL, -- CHARACTER SET '' | + | |
- | PRIMARY KEY(`id`), | + | |
- | UNIQUE KEY(`login`) | + | |
- | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</ | + | |
- | + | ||
- | Comment s' | + | |
- | + | ||
- | <code php><? | + | |
- | $bdd = new PDO(/* ... */); | + | |
- | + | ||
- | $insert = $bdd-> | + | |
- | $insert-> | + | |
- | + | ||
- | if ($insert-> | + | |
- | // ok, on a un nouvel inscrit | + | |
- | } else { | + | |
- | // erreur : le login est déjà utilisé | + | |
- | } | + | |
- | </ | + | |
- | + | ||
- | (le code est en PHP mais le principe peut être adapté à tout langage) | + | |
- | + | ||
- | IGNORE n'est qu'une option pour que lorsque l'on tente d' | + | |
- | + | ||
- | Par contre, cette solution ne convient pas si vous avez plusieurs contraintes d' | + | |
- | + | ||
- | ===== Insérer si inexistant sinon mettre à jour ===== | + | |
- | + | ||
- | Comme ci-dessus, si chaque ligne peut être identifiée de manière unique par la valeur d'une ou plusieurs colonnes, définies comme clé primaire (PRIMARY KEY) ou comme clé unique (UNIQUE KEY), alors il est possible de réaliser cette opération //insertion sinon mise à jour// en une seule requête de type INSERT ... ON DUPLICATE KEY UPDATE au lieu d' | + | |
- | <code sql>si SELECT COUNT(*) FROM ... WHERE colonne_unique = valeur renvoie une valeur non nulle (<> 0) | + | |
- | alors UPDATE | + | |
- | sinon INSERT</ | + | |
- | + | ||
- | Pour illustrer, prenons une situation courante, réaliser un import, ici de joueurs, via un flux XML fourni par la fédération. Tout d' | + | |
- | <code sql> | + | |
- | `licence` VARCHAR(80) NOT NULL, | + | |
- | `nom` VARCHAR(80) NOT NULL, | + | |
- | `prenom` VARCHAR(80) NOT NULL, | + | |
- | -- ... | + | |
- | PRIMARY KEY(`licence`) | + | |
- | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</ | + | |
- | + | ||
- | On reconnaît un joueur d'un autre via son numéro de licence, unique. Le but, en parsant ce flux, est double : | + | |
- | - ajouter les nouveaux joueurs à notre base | + | |
- | - mettre à jour éventuellement les informations personnelles de ceux que nous avions (changement d' | + | |
- | - (on ne gère pas les retraits de licence - DELETE) | + | |
- | + | ||
- | <code php> | + | |
- | + | ||
- | $bdd = new PDO(/* ... */); | + | |
- | $iou = $bdd-> | + | |
- | foreach ($sxml->joueur as $j) { | + | |
- | $iou-> | + | |
- | $iou-> | + | |
- | $iou-> | + | |
- | $iou-> | + | |
- | $iou-> | + | |
- | }</ | + | |
- | + | ||
- | Encore une fois, c'est codé en PHP mais parfaitement transposable à tout langage puisque c'est la requête SQL qui compte. | + | |