99 votes

SQL - SI EXISTE, METTRE À JOUR, SINON INSÉRER DANS

Ce que j'essaie de faire, c'est INSERT dans ma base de données, mais IF EXISTS il devrait UPDATE la rangée, ELSE INSERT INTO une nouvelle rangée.

Bien sûr, je me connecte d'abord à la base de données et GET el $name , $email y $birthday à partir de la chaîne url.

$con=mysqli_connect("localhost","---","---","---");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$name=$_GET['name']; 
$email=$_GET['email'];
$birthday=$_GET['birthday'];

Cela fonctionne, mais n'ajoute que la nouvelle ligne ;

mysqli_query($con,"INSERT INTO subs (subs_name, subs_email, subs_birthday)
VALUES ('$name', '$email', '$birthday')");

mysqli_close($con);

Voici ce que j'ai essayé ;

mysqli_query($con,"INSERT INTO subs (subs_name, subs_email, subs_birthday)
VALUES '$name', '$email', '$birthday'
ON DUPLICATE KEY UPDATE subs_name = VALUES($name), subs_birthday = VALUES($birthday)");
mysqli_close($con);

et

mysqli_query($con,"IF EXISTS (SELECT * FROM subs WHERE subs_email='$email')
    UPDATE subs SET subs_name='$name', subs_birthday='$birthday' WHERE subs_email='$email'
ELSE
    INSERT INTO subs (subs_name, subs_email, subs_birthday) VALUES ('$name', '$email', '$birthday')");
mysqli_close($con);

et

mysqli_query($con,"IF NOT EXISTS(SELECT * FROM subs WHERE subs_email='$email')
Begin
INSERT INTO subs (subs_name, subs_email, subs_birthday)
VALUES ('$name', '$email', '$birthday')
End");
mysqli_close($con);

Mais aucun d'entre eux ne fonctionne, qu'est-ce que je fais mal ?

Toute aide est grandement appréciée !

239voto

eggyal Points 60363
  1. Créer un UNIQUE contrainte en su subs_email si elle n'existe pas déjà :

    ALTER TABLE subs ADD UNIQUE (subs_email)
  2. Utilice INSERT ... ON DUPLICATE KEY UPDATE :

    INSERT INTO subs
      (subs_name, subs_email, subs_birthday)
    VALUES
      (?, ?, ?)
    ON DUPLICATE KEY UPDATE
      subs_name     = VALUES(subs_name),
      subs_birthday = VALUES(subs_birthday)

Vous pouvez utiliser la fonction VALUES(col_name) dans la clause UPDATE pour pour faire référence aux valeurs des colonnes de la partie INSERT de la clause INSERT ... ON. MISE À JOUR DES CLÉS DUPLIQUÉES - dev.mysql.com

  1. Notez que j'ai utilisé des caractères de remplacement de paramètres à la place de chaînes de caractères, comme une vraiment devrait utiliser des déclarations paramétrées pour se défendre contre les attaques par injection SQL .

2voto

Manish Kumar Points 21

Essayez ça :

INSERT INTO `center_course_fee` (`fk_course_id`,`fk_center_code`,`course_fee`) VALUES ('69', '4920153', '6000') ON DUPLICATE KEY UPDATE `course_fee` = '6000';

2voto

Tim Carr Points 11
INSERT ... ON DUPLICATE KEY UPDATE

est une bonne solution tant que cela ne vous dérange pas que les compteurs AUTO_INCREMENT s'incrémentent inutilement chaque fois que vous effectuez un UPDATE. Comme il essaie d'INSERTER en premier, j'ai remarqué que les compteurs automatiques s'incrémentent. Une autre solution que j'apprécie et qui est peut-être moins performante, mais facile à maintenir est la suivante :

IF EXISTS(SELECT 1 FROM table WHERE column = value...) THEN
    UPDATE table 
    SET column = value ...
    WHERE other_column = other_value ...;
ELSE
    INSERT INTO table
        (column1, column2, ...)
    VALUES
        (value1, value2, ...);
END IF;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X