web-dev-qa-db-fra.com

Insérer dans ... (...) (Sélectionnez ...) sur la mise à jour de la clé en double

Pouvez-vous m'aider à résoudre un problème? La tâche consiste à insérer un enregistrement dans la base de données MySQL. termes:

  • Si l'enregistrement existe - pour mettre à jour l'enregistrement.
  • Si l'enregistrement n'existe pas - pour en créer un nouveau.

Les colonnes de clé de la table 'Netflow'. 'Mois' sont:

  • 'Année'
  • 'Mois'
  • 'Jour'
  • 'Heure'
  • 'srcaddr'
  • 'DSTADDR'.

La chose est la question aussi rapidement que possible et si possible dans une requête.

Le texte de la requête actuelle est:

    INSERT INTO `netflow`.`Month` (`Year`, `Month`, `Day`, `Hour`, `srcaddr`,`dstaddr`, `doctets`)
    (
      SELECT 
        YEAR( FROM_UNIXTIME(  `unix_secs` ) ) AS `YEAR`, 
        MONTH( FROM_UNIXTIME(  `unix_secs` ) ) AS `MONTH`, 
        DAYOFMONTH( FROM_UNIXTIME(  `unix_secs` ) ) AS `DAY`, 
        HOUR( FROM_UNIXTIME(  `unix_secs` ) ) AS `HOUR`,  
        `srcaddr` ,  
        `dstaddr` ,  
        `doctets` 
      FROM  `netflow`.`raw` 
        WHERE `unix_secs` <= 1394179200
      GROUP BY 
        `YEAR`, 
        `MONTH`, 
        `DAY`, 
        `HOUR`,
        `srcaddr`,
        `dstaddr`
    )
    ON DUPLICATE KEY UPDATE

...
2
Nick

si vous souhaitez modifier la valeur avec le nouveau, vous pouvez utiliser:

ON DUPLICATE KEY UPDATE 
    doctets = VALUES(doctets) ;

ou si vous souhaitez ajouter la nouvelle valeur à l'existant:

ON DUPLICATE KEY UPDATE 
    doctets = doctets + VALUES(doctets) ;
5
ypercubeᵀᴹ
INSERT INTO `netflow`.`Month` (`Year`, `Month`, `Day`, `Hour`, `srcaddr`,`dstaddr`, `doctets`)
(
  SELECT 
    YEAR( FROM_UNIXTIME(  `unix_secs` ) ) AS `YEAR`, 
    MONTH( FROM_UNIXTIME(  `unix_secs` ) ) AS `MONTH`, 
    DAYOFMONTH( FROM_UNIXTIME(  `unix_secs` ) ) AS `DAY`, 
    HOUR( FROM_UNIXTIME(  `unix_secs` ) ) AS `HOUR`,  
    `srcaddr` ,  
    `dstaddr` ,  
    `doctets` 
  FROM  `netflow`.`raw` 
    WHERE `unix_secs` <= 1394179200
  GROUP BY 
    `YEAR`, 
    `MONTH`, 
    `DAY`, 
    `HOUR`,
    `srcaddr`,
    `dstaddr`
)
ON DUPLICATE KEY UPDATE SET col_name1 = val1, col_name2 = val2

vous pouvez aussi utiliser REPLACE INTO. Si la clé existe déjà, il mettra à jour le disque d'autre que cela insérera un nouvel enregistrement.

REPLACE INTO `netflow`.`Month` (`Year`, `Month`, `Day`, `Hour`, `srcaddr`,`dstaddr`, `doctets`)
(
  SELECT 
    YEAR( FROM_UNIXTIME(  `unix_secs` ) ) AS `YEAR`, 
    MONTH( FROM_UNIXTIME(  `unix_secs` ) ) AS `MONTH`, 
    DAYOFMONTH( FROM_UNIXTIME(  `unix_secs` ) ) AS `DAY`, 
    HOUR( FROM_UNIXTIME(  `unix_secs` ) ) AS `HOUR`,  
    `srcaddr` ,  
    `dstaddr` ,  
    `doctets` 
  FROM  `netflow`.`raw` 
    WHERE `unix_secs` <= 1394179200
  GROUP BY 
    `YEAR`, 
    `MONTH`, 
    `DAY`, 
    `HOUR`,
    `srcaddr`,
    `dstaddr`
)
1
Deepak