Я знаю этот вопрос, но это не помогло.
У меня есть список с идентификаторами и значениями. Теперь я должен проверить, существует ли идентификатор в моей пользовательской базе данных. Если это так, то строка будет обновлена, иначе мне придется вставить идентификатор в другую таблицу (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;