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

SQL Firebird Discussion :

duplicate entry sur table avec clé primaire sur 2 champs.


Sujet :

SQL Firebird

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 18
    Points : 15
    Points
    15
    Par défaut duplicate entry sur table avec clé primaire sur 2 champs.
    bonsoir,
    je n'arrive pas a voir quelle requete lancer pour copier les data d'une table dans une autre. J'ai 2 tables de meme structure, sauf que la log a une clé primaire sur 2 champs (ts et object). La table log20150411 a quant elle aucune une clé primaire. Du coup j'ai des doublons dans cette table.

    CREATE TABLE IF NOT EXISTS `log` (
    `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `object` varchar(256) NOT NULL,
    `value` varchar(256) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    INSERT INTO log
    SELECT * FROM log20150411;

    forcément, ca ne marche pas. Comment puis je faire pour insérer dans la table log les record de la table log20150411 en ignorant les doublons ?

    Merci pour votre aide.
    Arnaud

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    s'il y a des doublons, automatiquement on perdra quelque chose. Pour les supprimer on peut tenter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO log
    SELECT ts,object,Max(value) FROM log20150411 group by 1,2;
    MAX(value) ou MIN(value) bien sûr.
    une autre solution pour ne perdre aucun élément passerait par l'addition d'un compteur dans la valeur de la colonne Object

    mais la meilleure solution A.M.H.A. , surtout s'il s'agit d'un log, est de rajouter un colonne d'identification unique de record dans la table log, colonne utilisant une SEQUENCE (aussi nommé GENERATOR) et géré par un TRIGGER et d'oublier cette clé primaire composée (à l'occasion en faire un index non unique)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    CREATE SEQUENCE ID_LOG;  
     
    CREATE TABLE LOG
    ( ID_LOG NUMERIC(18,0) NOT NULL,
      TS timestamp DEFAULT CURRENT_TIMESTAMP,
      OBJECT VARCHAR(256) NOT NULL,
      "VALUE" VARCHAR(256) NOT NULL,
      CONSTRAINT PK_LOG PRIMARY KEY (ID_LOG)
    ); 
    -- ancienne clé primaire
    CREATE INDEX IDX_LOG ON LOG (TS, OBJECT);
     
    -- Trigger générant l'identification
    SET TERM !! ;
    CREATE TRIGGER LOG_BI FOR LOG
    ACTIVE BEFORE INSERT POSITION 0
    AS
    DECLARE VARIABLE tmp DECIMAL(18,0);
    BEGIN 
      -- ici on peut même gérer TS
      IF (NEW.TS IS NULL) THEN NEW.TS=CURRENT_TIMESTAMP;
      -- gestion id unique 
      IF (NEW.ID_LOG IS NULL) THEN
        NEW.ID_LOG = GEN_ID(ID_LOG, 1);
      ELSE
      BEGIN
        tmp = GEN_ID(ID_LOG, 0);
        if (tmp < new.ID_LOG) then
          tmp = GEN_ID(ID_LOG, new.ID_LOG-tmp);
      END
    END!!
    SET TERM ; !!
    ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO log(ts,object,"value") 
    SELECT ts,object,"value" FROM log20150411
    ne posera aucun problème de clé en double et aucun log ne sera perdu

    petite parenthèse VALUE est un mot réservé (du moins avec la version 2.5) avec les problèmes que cela implique
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    bonsoir,
    merci l'ami ! c'est formidable les forums. Je mets de coté
    Par contre, la suite ne fonctionne pas.
    en fait ce sont des log liés à mon systeme domotique que j'archive (1 million de lignes !). Tout ca sur 1 RPI (en systeme backup et dev) et un debian sur vmware esxi de prod.

    Par contre, je n'ai pas réussi a créer les index via ton ex sous phpmyadmin. ca pousse trop loin pour moi ! je suis preneur si effectivement je peux optimiser la database, mais il me faudra certainnement une assistance poussée ;(.

    cdlmnt.
    Arnaud

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour
    Citation Envoyé par Acognard
    Par contre, je n'ai pas réussi a créer les index via ton ex sous phpmyadmin. ca pousse trop loin pour moi ! je suis preneur si effectivement je peux optimiser la database, mais il me faudra certainement une assistance poussée ;(.
    Certainement parce que, j'ai l'impression qu'il ne s'agit pas d'une base Firebird qui est utilisée, en fait le CREATE de la table m'avais mis la puce à l'oreille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ENGINE=MyISAM DEFAULT CHARSET=utf8;
    mais comme ce post était dans le forum Firebird , j'y ai répondu en "Firebird" et non en "MySQL" (enfin si phpadmin ne gère que des bases MySQL ?)
    Le principe reste le même cependant, par contre la réalisation .... je ne maitrise pas suffisamment MySQL (surtout la partie Trigger)

    Donc une assistance plus poussée sera certainement a demander dans le bon forum
    http://www.developpez.net/forums/f44...donnees/mysql/ s'il s'agit bien de MySQL
    ou de l'un des nombreux sous-forum de http://www.developpez.net/forums/f4/bases-donnees/
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Bonjour, ach je n'ai pas fait attention que je n'étais pas dans la bonne rubrique ! Merci pour ton aide. Bon WE. Arnaud

Discussions similaires

  1. sqlite select sur table avec plusieurs clefs primaire
    Par Nono1nd dans le forum Android
    Réponses: 4
    Dernier message: 08/06/2012, 12h34
  2. lenteur sur table avec beaucoup de colonne
    Par ukanoldai dans le forum Oracle
    Réponses: 3
    Dernier message: 23/01/2007, 14h36
  3. Insert avec select sur table avec Trigger d'insertion
    Par bran_noz dans le forum Développement
    Réponses: 5
    Dernier message: 23/12/2005, 15h38
  4. Requete sur table avec Tableau
    Par Sichagadel dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/11/2005, 15h05
  5. Requête sur table à double clés primaires
    Par darkian dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/03/2005, 18h28

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