INSERT IF NOT EXIST

Ce sujet est résolu
112438
,

Bonjour,

désolé si cette question a déjà été postée, je n'ai pas trouvé...

j'ai une table de relations sans clef primaire avec 4 champs : id1, id2, type_rel, options_rel
est-il possible de vérifier qu'un trio (id1, id2 et type_rel) n'existe pas avant de l'insérer en une seule requête ?
(je pourrais faire 2 requêtes : une qui vérifie l'autre qui insère si besoin, mais... ;))

mon code

$db = Helper::getDB();
            foreach($ids as $id){
                $p = array(
                    'id1' => $id,
                    'id2' => $params['user'],
                    'type_rel' => 'produits_user',
                    'options_rel' => ''
                );
                $sql = 'INSERT INTO `'.DB_PRE.'relations` ';
                $sql.= '(`id1`, `id2`, `type_rel`, `options_rel`) ';
                $sql.= "VALUES ";
                $sql.= '(:id1, :id2, :type_rel, :options_rel) ';
                // $sql.= 'ON DUPLICATE KEY UPDATE `??`="??"'; // je ne peux pas car je n'ai pas de key
                $sql.= 'WHERE NOT EXISTS ('; // j'ai essayé avec une sous requête mais ça ne fonctionne pas
                    $sql.= 'SELECT * FROM `'.DB_PRE.'relations` ';
                    $sql.= 'WHERE `id1` = '.$id.' ';
                    $sql.= 'AND `id2` = '.$params['user'].' ';
                    $sql.= 'AND `type_rel` = "produits_user"';
                $sql.= ')';

                $req = $db->prepare($sql);
                try {
                    $req->execute($p);
                }
                catch (PDOException $e) {
                    echo "An SQL error occurred: ".$e->getMessage();
                }
            }
            echo 'lébon';
            $db = null;

ça me retourne :

An SQL error occurred: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE NOT EXISTS (SELECT * FROM `vegetal_relations` WHERE `id1` = 28051 AND `id2' at line 1

merci

2 Réponse

44835
,

Pourquoi tu ne crées pas un index unique composé des 3 colonnes
comme ça l'insertion sera bloquée si le triplet existe.

112438
, Il a répondu à ma question !

Merci @Huggy, tout simplement...
le code :

$db = Helper::getDB();
            foreach($ids as $id){
                $p = array(
                    'id_rel' => $id.$params['user'].'pdtusr', // le trio gagnant !! merci @huggy
                    'id1' => $id,
                    'id2' => $params['user'],
                    'type_rel' => 'produits_user',
                    'options_rel' => $params['options']
                );
                $sql = 'INSERT INTO `'.DB_PRE.'relations` ';
                $sql.= '(`id_rel`, `id1`, `id2`, `type_rel`, `options_rel`) ';
                $sql.= "VALUES ";
                $sql.= '(:id_rel, :id1, :id2, :type_rel, :options_rel) ';
                $sql.= 'ON DUPLICATE KEY UPDATE `options_rel`= "'.$params['options'].'"';

                $req = $db->prepare($sql);
                try {
                    $req->execute($p);
                }
                catch (PDOException $e) {
                    echo "An SQL error occurred: ".$e->getMessage();
                }
            }
            echo 'lébon';
            $db = null;

++
seb