ОБНОВЛЕНИЕ с помощью операторов CASE с использованием аналогичного внешнего ключа - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь обновить базу данных, в которой отслеживается домашнее хозяйство. Он хранит главу домохозяйства как клиента в отдельной таблице, но использует их ID в качестве внешнего ключа в таблице домохозяйства. Мне нужно добавить несколько человек в семью. Я пробовал использовать только оператор UPDATE, но он заменял данные только тогда, когда я пытался добавить сразу несколько человек. Я пытаюсь сделать это, не используя операторы DELETE и INSERT из опасения потерять информацию. Для получения дополнительной информации, всем этим управляет PHP Веб-сайт без жира, потому что моя школа учит этому.

function editHousehold($id, $name, $age, $gender){
    $id = $this->getLastId();

    $sql= "UPDATE Household SET `name`=:name, age=:age, gender=:gender WHERE 
           Guests_ClientId=:Guests_ClientId";
    $statement = $this->dbh->prepare($sql);
    $statement->bindParam(':name', $name, PDO::PARAM_STR);
    $statement->bindParam(':age', $age, PDO::PARAM_STR);
    $statement->bindParam(':gender', $gender, PDO::PARAM_STR);
    $statement->bindParam(':Guests_ClientId', $id, PDO::PARAM_INT);
    $statement->execute();
}

Против

function editNeeds($id,$resource,$date, $amount, $voucher, $checkNum){
    $sql = "DELETE FROM Needs WHERE Guests_ClientId = $id";
    $statement = $this->dbh->prepare($sql);
    $statement->execute();
    $id = $this->getLastId();
    $sql= "INSERT INTO Needs (resource, visitDate, amount, voucher, checkNum, Guests_ClientId)
            VALUES (:resource, :date , :amount, :voucher, :checkNum, $id)";
    $statement = $this->dbh->prepare($sql);
    $statement->bindParam(':resource', $resource, PDO::PARAM_STR);
    $statement->bindParam(':amount', $amount, PDO::PARAM_STR);
    $statement->bindParam(':voucher', $voucher, PDO::PARAM_STR);
    $statement->bindParam(':checkNum', $checkNum, PDO::PARAM_STR);
    $statement->bindParam(':date', $date, PDO::PARAM_STR);
    $statement->execute();
}
/**
 * edit households, removes the old and replaces witha new set of values
 * @param $id
 * @param $name
 * @param $age
 * @param $gender
 */
function editHousehold($id, $name, $age, $gender){
    $sql = "DELETE FROM Household  WHERE Guests_ClientId = $id";
    $statement = $this->dbh->prepare($sql);
    $statement->execute();
    $id = $this->getLastId();
    $sql= "INSERT INTO Household (name, age, gender,Guests_ClientId)
            VALUES (:name,:age,:gender,$id)";
    $statement = $this->dbh->prepare($sql);
    $statement->bindParam(':name', $name, PDO::PARAM_STR);
    $statement->bindParam(':age', $age, PDO::PARAM_STR);
    $statement->bindParam(':gender', $gender, PDO::PARAM_STR);
    $statement->execute();
}

1 Ответ

0 голосов
/ 07 мая 2020

Я думаю, вы ищете оператор типа «либо вставить новую запись, либо обновить, если существует первичный ключ». Это называется «upsert», и MySQL предоставляет его в виде INSERT ... ON DUPLICATE KEY UPDATE.

Он вставляет новые записи, , если не является первичным ключом одна из записей для вставки уже существует. Если это так, вместо этого будет обновлена ​​существующая запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...