Outils pour utilisateurs

Outils du site


basededonnees:mysql

Convertir une colonne timestamp Unix en DATETIME

ALTER TABLE sujet ADD tmpswap DATETIME;
UPDATE sujet SET tmpswap = FROM_UNIXTIME(ancien);
ALTER TABLE sujet DROP ancien;
ALTER TABLE sujet CHANGE tmpswap ancien DATETIME;

(sujet : nom de la table ; ancien : nom de la colonne initialement en (big)int)

Convertir une colonne VARCHAR pour dates au format fr (d/m/Y) en DATE

ALTER TABLE sujet ADD tmpswap DATE;
UPDATE sujet SET tmpswap = STR_TO_DATE(ancien, '%d/%m/%Y');
ALTER TABLE sujet DROP ancien;
ALTER TABLE sujet CHANGE tmpswap ancien DATE;

(sujet : nom de la table ; ancien : nom de la colonne initialement en varchar)

Pourquoi utiliser le type DATE ?

  • pour simplifier toute manipulation sur les dates : vous pouvez ainsi nativement utiliser toutes les fonctions date du SGBD sans avoir à d'abord reconvertir [le format de] la date
  • le format interne (us) prévu permet nativement un tri (lexicographique) correct
  • le formatage au format fr (ou autres) ne justifie pas une colonne en VARCHAR : tous les langages ou même les SGBD (DATE_FORMAT pour MySQL) permettent facilement la conversion. Et quid du jour où votre site devra être internationalisé ?
  • le SGBD s'assure que la date est un minimum correct, toute erreur à l'insertion/modification est minimisée. Au contraire, avec un varchar, si le format est incorrect, ça peut être catastrophique suivant l'importance des données. MySQL avec un sql_mode comprenant les valeurs NO_ZERO_IN_DATE (interdit des composantes de date à 0) et NO_ZERO_DATE (interdit les dates "zéro" 0000-00-00 obtenues par défaut dans des cas +/- foireux) et sans ALLOW_INVALID_DATES assurera une cohérence des plus strictes.

Mapper des valeurs en d'autres lors d'une requête

On peut aisément remplacer un CASE comme celui-ci :

SELECT CASE <in>
    WHEN 'FT' THEN 'Fiche Technique'
    WHEN 'PV' THEN 'Procès Verbal'
    WHEN 'NF' THEN 'Norme'
    ELSE 'Valeur par défaut'
END;

Par :

COALESCE(
    ELT(
        FIELD(<in>, 'FT', 'PV', 'NF'),
        'Fiche Technique', 'Procès Verbal', 'Norme'
    ),
    'valeur par défaut'
)

C'est l'"équivalent" PHP de :

$out = str_replace(array('FT', 'PV', 'NF'), array('Fiche Technique', 'Procès Verbal', 'Norme'), $in);
# ou, mieux :
$out = ['FT' => 'Fiche Technique', 'Procès Verbal', 'NF' => 'Norme'][$in];

Par contre : ça revient éventuellement à "réinventer" le type ENUM

Désactiver (temporairement) les clés étrangères

SET FOREIGN_KEY_CHECKS=0;
 
-- les différentes opérations sql à exécuter en ignorant les clés étrangères
 
SET FOREIGN_KEY_CHECKS=1;

Les timezones et comment régler l'heure

Optimisation : éviter des SELECT inutiles

basededonnees/mysql.txt · Dernière modification: 22/03/2017 17:19 de julp