75 votes

PHP MYSQL UPDATE if Exist ou INSERT if not ?

Je n'ai aucune idée si c'est même vaguement correct. J'ai une classe où je voudrais mettre à jour la base de données si les champs existent actuellement ou insérer s'ils n'existent pas. La complication est que je fais une jointure de 3 tables (set_colors, school_art, baseimage).

Toute aide serait la bienvenue.

Voici ce que j'ai :

public function set_layer_colors($value) {
    global $db;

    $result_array = mysql_query("
    IF EXISTS(SELECT * FROM set_colors WHERE school_art_id = '{$value}')

      UPDATE set_colors (school_art_id, baseimage_id, sub_folder, layer)
        SELECT school_art.id, baseimage.id, baseimage.sub_folder, baseimage.layer
        FROM school_art 
        JOIN baseimage ON baseimage.base_folder = school_art.series_code 
        WHERE baseimage.image_type = 'B' ORDER BY school_art.id 

    ELSE

     INSERT INTO set_colors (school_art_id, baseimage_id, sub_folder, layer)
        SELECT school_art.id, baseimage.id, baseimage.sub_folder, baseimage.layer
        FROM school_art 
        JOIN baseimage ON baseimage.base_folder = school_art.series_code 
        WHERE baseimage.image_type = 'B' ORDER BY school_art.id 
        ");

    return $result_array;
}

192voto

Tash Pemhiwa Points 2800

Je pense que vous recherchez la syntaxe suivante :

INSERT INTO <table> (field1, field2, field3, ...) 
VALUES ('value1', 'value2','value3', ...)
ON DUPLICATE KEY UPDATE
field1='value1', field2='value2', field3='value3', ...

Note : Avec ON DUPLICATE KEY UPDATE la valeur des rangées affectées par rangée est de 1 si la ligne est inséré comme une nouvelle ligne, 2 si une ligne existante est actualisé y 0 si une ligne existante est fixé à ses valeurs actuelles .

Documentation MySQL : INSERT ... ON DUPLICATE KEY UPDATE Statement

6 votes

Pour être plus correct, vous n'avez pas besoin d'indiquer les clés primaires. Donc si field1 est une clé, alors ...... ON DUPLICATE KEY UPDATE champ2='valeur2', champ3='valeur3', ... (en commençant par le champ2)

1 votes

N'oubliez pas de donner à la colonne cible la contrainte UNIQUE

1 votes

@StefanoZanetti, les noms de vos champs ne correspondent pas : psw vs password . De plus, vous n'avez pas précisé le role dans la clause ON DUPLICATE KEY UPDATE (je ne suis pas sûr que cela ait de l'importance).

34voto

Dan Grossman Points 31514

Deux choix :

Manuel MySQL : : INSERT INTO ... ON DUPLICATE KEY UPDATE Syntaxe

o

Manuel MySQL : : Syntaxe REPLACE INTO

Les deux vous permettront d'effectuer l'insertion-si-non-existe-ou-mise-à-jour en une seule requête.

0 votes

Merci, REPLACE INTO est bien meilleur dans mon cas, sinon je devrais appeler "$query->send_long_data(1, $buff)" deux fois, une pour l'INSERT et une pour l'UPDATE.

6 votes

Non... Si nous utilisons "REPLACE INTO", les données de l'autre table liée à FOREIGN KEY seront supprimées si les données PRIMAIRES existent.

1 votes

Avertissement sur REPLACE -- il supprime implicitement l'entrée qu'il tente de mettre à jour et en ajoute une nouvelle, donc si vous avez une entrée de type AUTO_INCREMENT comme ID il sera également auto-incrémenté !

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