IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Update de dates entre deux tables [MariaDB]


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut Update de dates entre deux tables
    Bonjour,

    J´ai 2 tables :
    1. Lot_Client
    2. Production


    Dans la table Lot_client j´ai la colonne "Date_prepa" et "numero_lot".
    Dans la table Production j´ai la colonne "Lot_client" et "Date_envoi".
    Dans "Lot_client.numero_lot" et "Production.Lot_client" on a le meme numero.

    Comment update toute la colonne "Production.Date_envoi" avec la date de "Lot_client.Date_prepa" en se basant sur "Lot_client.numero_lot" = "Production.Lot_client".
    Merci

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Qu'avez-vous déjà essayé comme requête ? Quel en est le résultat ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Bonjour,
    J´ai envie de tester ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE Production.Date_envoi
    SET    
    Lot_client.Date_envoi = Production.Lot_client
    WHERE  
    Lot_client.numero_lot = Production.Lot_client
    Mais j´ai un doute de flinguer la base de donnée.
    Updater la colonne Date_envoi dans Production, ou Lot_client.numero_lot = Production.Lot_client.
    D´ou m´a demande avant de faire clique

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Il faut faire une jointure pour vérifier l'égalité du numéro de lot :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update Production  PR
    inner join Lot_Client LC
       on LC.numero_lot=PR.Lot_client
    set PR.Date_envoi=LC.Date_prepa
    ;

    Cette requête modifie potentiellement toutes les lignes de la table "Production", il faut éventuellement ajouter une restriction WHERE pour n'impacter que certaines lignes.

    Note : c'est ballot d'avoir choisi un nom de colonne (Lot_client) dans une table qui correspond au nom d'une autre table...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Merci @escartefigue.
    Mais en lançant la requête pour tester, j´ai cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > 1205 - Lock wait timeout exceeded; try restarting transaction
    > Time: 50,241s
    comment puis-je y remedier ?

    Peux t´on le faire por lots de lignes ?
    Car j´ai aux alentours de 120000 lignes

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    C'est plutôt lent comme exécution pour seulement 120 000 lignes.
    Est-ce que les colonnes de jointure sont bien de même type et de même longueur ?

    Si c'est le cas, on peut commencer par réorganiser les tables (OPTIMIZE TABLE), puis, si toujours KO, procéder par plages de lots en ajoutant une restriction WHERE

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Je vais verifier. Entre temps j´ai augmenter innodb_lock_wait_timeout mais je vais check ce que vous dites.
    Je reviens d`s que je peux.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Je viens de verifier:
    LC.numero_lot= VARCHAR 50
    PR.Lot_client=VARCHAR 50
    PR.Date_envoi= DATE
    LC.Date_prepa= DATE
    Donc oui même type et longueur apparement

  9. #9
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > 1205 - Lock wait timeout exceeded; try restarting transaction
    > Time: 50,241s
    Citation Envoyé par superthx
    comment puis-je y remédier ?
    Vous avez un problème de timeout. Il suffit d'augmenter la valeur de ce timeout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # ------------------------------#
    #     Timeout Configuration     #
    # ------------------------------#
     
    connect-timeout     = 600
    interactive-timeout = 600
    net-read-timeout    = 600
    net-write-timeout   = 600
    wait-timeout        = 600
    600 secondes = 60 x 10. Soit 10 minutes.

    A mettre dans votre fichier "my.ini".
    Vérifiez avant la valeur que vous avez pour ces variables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mysql> select @@global.connect_timeout;
    +--------------------------+
    | @@global.connect_timeout |
    +--------------------------+
    |                      600 |
    +--------------------------+
    1 row in set (0.00 sec)
     
    mysql>
    Attention au tiret qui devient un souligné.

    La lenteur peut s'expliquer si vous n'avez pas fait l'usage des index sur les colonnes de votre jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    on LC.numero_lot=PR.Lot_client
    Cordialement.
    Artemus24.
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Bonjour!
    En effet j´avais modifier le temps, mais cela etait trop long.
    Donc j´ai indexer les deux colonnes.
    Resultat moins d´une minute pour les 200000 lignes.
    Merci à vous deux.

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Toutes les colonnes déclarées PK sont automatiquement indexées
    Et toutes les colonnes FK devraient également l'être, faute de quoi, la plupart des jointures provoqueront des temps de traitement rédhibitoires.
    MySQL crée automatiquement l'index FK, du coup, sauf à l'avoir supprimé manuellement, je suis étonné que cet index était manquant.
    (il me semble d'ailleurs que MySQL devrait protester en cas d'absence de cet index, à vérifier)

  12. #12
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut Escartefigue.

    La seule explication possible si l'index de la clef étrangère est absente, est que la clef étrangère n'existe pas en tant que telle.

    J'ai vérifié. A partir du moment où dans la table fille, on crée une contrainte de type clef étrangère, MySql crée bien un index.

    Cordialement.
    Artemus24.
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    J'ai vérifié. A partir du moment où dans la table fille, on crée une contrainte de type clef étrangère, MySql crée bien un index.
    Oui pas de doute sur ce point, je me demande seulement comment se comporte MySQL si on drop l'index FK, volontairement ou non.
    Je suppose que MySQL va couiner, mais je n'en suis pas certain

  14. #14
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut Escartefigue.

    Si après avoir créé la clef étrangère, tu désires supprimer l'index, Mysql va provoquer une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1553 - Cannot drop index 'FK_01': needed in a foreign key constraint
    Cordialement.
    Artemus24
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Bon je sais que suis mauvais sur mysql.
    Mais pourquoi il a fallu mettre index dans mes colonnes ?
    Vous avez un texte expliquant cela ?
    Sur les key, index, etc... ?

  16. #16
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    Citation Envoyé par superthx
    Bon je sais que suis mauvais sur mysql.
    Dans ce cas là, vous devez lire la documentation sur MySql et apprendre en faisant des exercices.

    Citation Envoyé par superthx
    Mais pourquoi il a fallu mettre index dans mes colonnes ?
    Vous ne devez pas ajouter un index à votre clef étrangère.

    Vous devez effectuer la bonne déclaration dans votre table fille, qui est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONSTRAINT `FK_01` FOREIGN KEY (`clef`) REFERENCES `mere` (`mere_id`) ON DELETE CASCADE ON UPDATE CASCADE
    MySql sait créer l'index à partir de la contrainte sur la clef étrangère.

    Pour définir une clef étrangère, vous avez besoin de deux tables :

    a) la table mère aura un identifiant qui sera unique.
    Soit en tant que clef primaire, comme ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    `mere_id` integer unsigned NOT NULL auto_increment primary key
    ou soit en tant qu'index unique si cette colonne n'est pas déja une clef primaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE UNIQUE INDEX `idx` USING BTREE ON `mere` (`mere_id`);
    b) la table mère doit être déclarée avant la table fille.

    c) la table fille aura une colonne servant de clef étrangère.
    Cette colonne devra avoir la même déclaration que celle de la table mère.

    d) la déclarative dans la table fille est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    `clef` integer unsigned NOT NULL
    CONSTRAINT `FK_01` FOREIGN KEY (`clef`) REFERENCES `mere` (`mere_id`) ON DELETE CASCADE ON UPDATE CASCADE
    e) il n'y a pas obligation que la clef étrangère se nomme du même nom que la clef servant de référence.

    f) quand vous insérez une nouvelle ligne dans la table fille, la colonne servant de clef étrangère aura une valeur dont celle-ci sera au préalable déjà insérée dans la table mère.
    Sans cela, l'insertion sera rejetée.

    Citation Envoyé par superthx
    Vous avez un texte expliquant cela ?
    --> FOREIGN KEY Constraints

    Cordialement.
    Artemus24.
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  17. #17
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par superthx Voir le message
    Bon je sais que suis mauvais sur mysql.
    Mais pourquoi il a fallu mettre index dans mes colonnes ?
    Vous avez un texte expliquant cela ?
    Sur les key, index, etc... ?
    Bonjour,

    S'il n'y a pas d'index, les recherches se font séquentiellement en parcourant toute la table
    Pour une table peu chargée, par exemple de quelques milliers de lignes, c'est indolore.
    Pour des tables fortement chargées, le temps de recherche devient significatif
    Si en plus, il y a une jointure, alors le nombre de ligne parcourues est égal au produit cartésien de l'effectif de chacune des tables.
    Ce faisant, même avec un effectif modeste, le nombre de lignes à parcourir en l'absence d'index peut devenir très important.

    Exemple : jointure entre 3 tables ayant respectivement 5 000, 10 000 et 20 000 lignes, ce qui est très peu pour une base de données.
    Faute d'index, le nombre de lignes à parcourir serait de 5 000 x 10 000 x 20 000 = 1 000 000 000 000 ! (mille milliards de lectures !)

    Imaginez devoir trouver un numéro de téléphone dans un annuaire qui ne serait trié ni par département, ni par nom... Bon courage !

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Ok mais alors quel est la différence entre
    • Key
    • Unique
    • Fulltext
    • Spatial


    Aussi une fois mis un index peut t´on l´enlever ?

  19. #19
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    ... Et toutes les colonnes FK devraient également l'être, faute de quoi, la plupart des jointures provoqueront des temps de traitement rédhibitoires....
    Non, ça c'est particulièrement idiot et sert à pas grand chose.... D'ailleurs l'indexation automatique des FK est une imbécilité de plus de MySQmerde. Aucun autre SGBDR ne fait cela !

    Regardez le commentaire que nj'ai fait à ce sujet dans stackexchange...

    https://softwareengineering.stackexc...-good-practice

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  20. #20
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    Sous Mysql, la primary key est automatiquement indexée.
    En allant sous phpmyadmin, on voit l'index puisqu'il porte le nom par défaut de "PRIMARY".

    J'ai un vague souvenir que sous DB2 gros système, l'index primary key n'est pas automatiquement créé.
    Je crois qu'il faut faire explicitement la déclaration de la création de l'index pour l'obtenir.

    Quand on crée la contrainte sur la "foreign key", Mysql va créer automatiquement un index.
    Je ne vois pas trop à quoi peut servir cet index, puisque normalement la recherche est faite sur la table référencée, c'est-à-dire sur l'identifiant de la table mère.
    La clef étrangère servant en tant que foreign key est juste pour faire le lien.

    Je me pose la question si mysql ne gère pas le sens inverse, à savoir partir de la clef primaire de la table mère pour rechercher les clefs étrangères dans la table fille.
    Sauf que la plupart du temps, cette recherche en sens inverse n'a pas lieu.
    Une autre idée serait d'interdire dans la foreign key, le marquage à NULL.

    Je remarque que mysql abuse un peu trop souvent des index, pour résoudre certains problèmes qui n'ont pas lieu être.
    Par exemple, supprimer les doublons et l'on va créer un "unique index" sur la colonne".

    Cordialement.
    Artemus24.
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Liste de sélection sur date entre deux tables
    Par Gazole22 dans le forum QlikView
    Réponses: 3
    Dernier message: 16/07/2013, 12h38
  2. Probleme d'update entre deux tables
    Par faudet78 dans le forum Requêtes
    Réponses: 0
    Dernier message: 22/03/2010, 15h41
  3. requête update entre deux tables
    Par evevev dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/03/2010, 19h21
  4. Réponses: 4
    Dernier message: 09/11/2007, 18h08
  5. Syntaxe Update entre deux tables
    Par lenoil dans le forum SQL
    Réponses: 5
    Dernier message: 02/10/2007, 16h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo