Intereting Posts

Обновить, если строка существует, иначе вставить новую строку в другую таблицу

Я знаю этот вопрос, но это не помогло.

У меня есть список с идентификаторами и значениями. Теперь я должен проверить, существует ли идентификатор в моей пользовательской базе данных. Если это так, то строка будет обновлена, иначе мне придется вставить идентификатор в другую таблицу (tmp_user).

Изменить: Вот моя попытка

IF NOT EXISTS (SELECT * FROM `wcf1_user` WHERE `steamID` = 1) THEN INSERT INTO `wcf1_points_tmp` (`steamID`, `points`) VALUES (1, 2) ELSE // Update stuff...... END IF; 

Результат: # 1064 – У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MySQL, для правильного синтаксиса для использования рядом с «ЕСЛИ НЕ СУЩЕСТВУЕТ» (SELECT * FROM wcf1_user WHERE steamID = 1) THEN INSERT IN 'в строке 1

Спасибо за вашу помощь. 🙂

Если вы укажете ON DUPLICATE KEY UPDATE , и будет вставлена ​​строка, которая приведет к дублированию значения в индексе UNIQUE или PRIMARY KEY , будет выполнено UPDATE старой строки. Например, если столбец a объявлен как UNIQUE и содержит значение 1, следующие два оператора имеют одинаковый эффект:

 INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1; UPDATE table SET c=c+1 WHERE a=1; 

Это доменная логика, которая не входит в уровень данных. Сделайте это в PHP вместо этого:

 <?php // connect to the database $DSN = "mysql:dbname=$dbname;charset=utf8"; $opt = array(PDO::MYSQL_ATTR_FOUND_ROWS => true); $dbh = new PDO($DSN, $username, $password, $opt); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // one assumes you want to perform this operation atomically $dbh->beginTransaction(); // attempt to update the row $update = $dbh->prepare(' UPDATE wcf1_user SET ...... WHERE steamID = ? '); $update->execute(array($steamID)); // if the update didn't affect any rows if (!$update->rowCount()) { // insert into another table instead $insert = $dbh->prepare(' INSERT INTO wcf1_points_tmp (steamID, points) VALUES (?, ?) '); $insert->execute(array($steamID, $points)); } // tada! $dbh->commit(); ?> 

Я думаю, что вам не хватает точки с запятой в конце инструкции insert, попробуйте следовать,

 IF NOT EXISTS (SELECT * FROM `wcf1_user` WHERE `steamID` = 1) THEN INSERT INTO `wcf1_points_tmp` (`steamID`, `points`) VALUES (1, 2); ELSE // Update stuff...... remember to add semicolon at the end END IF;