INSERT IF NOT EXIST

Par saibe, il y a 7 ans


Base de données MySQL

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éponses

Huggy, il y a 7 ans

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

saibe, il y a 7 ans

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