Я создал таблицу
CREATE TABLE `pledge` (
`ID` INT(11) NOT NULL AUTO_INCREMENT,
`user` VARCHAR(45) NOT NULL,
`location` VARCHAR(45) NOT NULL,
`category` VARCHAR(45) NOT NULL,
`amount` DOUBLE NULL, NOT NULL,
`p_created` TIMESTAMP NOT NULL,
PRIMARY KEY (`ID`));
Я добавил уникальный ключ для пользователя, местоположения и категории в качестве index2.
Я хочу
INSERT a new record, if amount is not zero
UPDATE an existing record, if key (column user, location, category) exists
DELETE a record, if key (column user, location, category) exists AND amount is now zero
try {
$conec = new Connection();
$con = $conec->Open();
$p_created = date("Y-m-d H:i:s");
$sql = "INSERT INTO `pledge`(
`user`,
`location`,
`category`,
`amount`,
`p_created`)
VALUES (
:user,
:location,
:category,
:amount,
:p_created)";
$pre = $con->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
if ($pre->execute(array(
':user' => $user,
':location' => $location,
':category' => $category,
':amount' => $amount,
':p_created' => $p_created,
))) {
// echo "Successful";
}
} catch (PDOException $ex) {
echo $ex->getMessage();
}
} // try
Я обнаружил, что могу использовать что-то вроде "ON DUPLICATE KEY UPDATE col3 = 'alpha';", но не знаю, как в приведенном выше php-коде.Поскольку это существует, может быть также возможность удалить вместо обновления, если сумма равна нулю.
Обновление:
Спасибо Робби за ваши подсказки.Почему-то я все еще допускаю ошибки.Я пробовал много способов, но ...
Сначала мне пришлось поменять стол.Я удалил идентификатор первичного ключа и добавил новый первичный ключ, содержащий столбцы user, location, category.
Чтобы упростить исходный вопрос, я обновил только один столбец, но на самом деле это два столбца.
С этими изменениями я смог вставить / обновить, как я планировал, в командной строке (Workbench): INSERT INTO pledge
(user
, location
, category
, mypercent
, mybalance
, p_created
) ЗНАЧЕНИЯ ('5cdae45bdb5c5', 'Linz', 'A14', 50, 300, '2019-05-21 11:12:22') ОБ ОБНОВЛЕНИИ КЛЮЧЕВЫХ КЛЮЧЕЙ mypercent
= 20, mybalance
= 53;
Работает как положено.Первый раз он будет вставлен с mypercent = 50 и mybalance = 300, а во второй раз, когда я попробую ту же самую команду, я получу обновление записи до mypercent = 20 и mybalance = 53
Однако я не могу получить ЭТОсинтаксис в моей программе PHP.Это последняя попытка:
try {
$conec = new Connection();
$con = $conec->Open();
$p_created = date("Y-m-d H:i:s");
$sql = "INSERT INTO `pledge`(
`user`,
`location`,
`category`,
`mypercent`,
`mybalance`,
`p_created`)
VALUES (
:user,
:location,
:category,
:mypercent,
:mybalance,
:p_created)
ON DUPLICATE KEY UPDATE (`mypercent` = $percent[0], `mybalance` = $balance[0])
";
// worked on command line: UPDATE `pledge` SET `mypercent`='10',`mybalance`='10' WHERE `user`='5ce3770041037' and `location`='Linz' and`category`='A14';
// ON DUPLICATE KEY UPDATE `p_mypercent`=20, `mybalance` = 53;
$pre = $con->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
if ($pre->execute(array(
':user' => $user,
':location' => $locationid,
':category' => $category,
':mypercent' => $percent[0],
':mybalance' => $balance[0],
':p_created' => $p_created,
))) {
// echo "Successful";
} // if ($pre->execute(array(
} catch (PDOException $ex) {
echo $ex->getMessage();
} // try
Это дает мне синтаксическую ошибку: SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 В синтаксисе SQL есть ошибка;проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с '(mypercent
= 10, mybalance
= 10) mypercent
,' в строке 17