Синтаксис MariaDB для вставки при повторном обновлении ИЛИ с использованием CASE - PullRequest
0 голосов
/ 29 октября 2019

Я бы хотел снять отпечатки пальцев с устройства и сохранить результат вместе с идентификатором сеанса в MariaDb. Я пишу на PHP, используя драйвер PDO. Я генерирую распечатанную клиентскую часть на посещенной странице и отправляю XHR в storePrint.php. Я хотел бы обновить существующие записи ИЛИ вставить новую, если они не существуют. Ниже приведен фрагмент исходного кода. Печать может уже существовать с другим идентификатором сеанса, и печать может измениться без изменения сеанса. Я хотел бы обновить отметку времени print, sessionId и lastVisited (которую я использую десятичную 14,4 и microtime (true) для этого, так что это не совсем отметка времени, но это другая касательная.

storePrint.php:

require_once('./library.php');
if(isset($_POST) && !empty($_POST))
{
    $_POST = sanitize($_POST); // Clean up input.
    $from = $_POST['from'];
    $print = $_POST['clientPrint']; // max length = 32 characters
    $sId = $_POST['sessionId']; // max-length = 64 characters
    updatePrint($sId,$print,$from);
}
library.php:

    function updatePrint($id,$print,$from)
    {
        $now = microtime(true);
        $sql = "INSERT INTO prints (print,sessionId,lastUpdated) VALUES (:print,:sid,:lastC) ON DUPLICATE KEY UPDATE print=:print, sessionId = :sId, lastUpdated = :lastV";

        $import = [":print" => $print,":sid" => $id,
        ":lastC" => $now,
        ":sId" => $id];//       ":lastV" => $now,
        $connection = connectToDB();
        $statement = $connection->prepare($sql);
        $result = $statement->execute($import);
        $count = $statement->rowCount();

        if($count > 0)
        {
        }else
        {
            echo 'Failure';
        }

    }

Печать генерируется на стороне клиента после загрузки документа и запуска XHR для storePrint.php. В надежде, что запись обновлена, или в случае, если этот print ИЛИ sessionId еще не существует, создается новыйПроблема в том, что print или sessionId могут меняться без других изменений. Мне нужно найти способ ( с использованием одного запроса, если возможно ), чтобы проверить, существует ли print или sessionId. Если существуетзатем обновите остальные (print, lastVisited в случае, если мы нашли запись с тем же идентификатором sessionId ИЛИ sessionId, lastVisited, если мы нашли совпадающую печать). Кто-то указал, что я, возможно, плохо спроектировал свою таблицу для того, что я хочу сделатьОбновление вызывает нарушение ограничений целостности. Так потеряно ... Я сделал идентификатор Primary с автоматическим приращением и напечатал униque и sessionId уникальны. Пожалуйста, подтолкните меня в правильном направлении. Другие запросы, которые я пытался использовать, были:

INSERT INTO prints (print, sessionId, lastUpdated) VALUES (:print,:sid,:lastC) CASE WHEN print <> :print THEN :print ELSE print END, last_update = CASE WHEN print <> :print THEN :lastV ELSE lastUpdated END;
INSERT INTO prints (print,sessionId,lastUpdated) VALUES (:print,:sid,:lastC) ON DUPLICATE KEY UPDATE print = CASE print WHEN <> THEN :print, ELSE print END, sessionId = CASE sessionId WHEN <> :sid THEN :sid ELSE sessionId END, lastUpdated=now()

и

INSERT INTO prints (print, sessionId, lastUpdated) VALUES (:print, :sid, :lastC) ON DUPLICATE KEY UPDATE     lastUpdated = CASE WHEN print <> :print THEN :lastC ELSE lastUpdated END, print = CASE WHEN print <> :print THEN :print ELSE print END

Я обнаружил, что использование подготовленных операторов PDO и использование VALUE () вызывало у меня проблему синтаксиса, какон избежал бы уже экранированных строк, превратив их в-> VALUES ('' 88fe273778rs8s ... ''), после чего я вернулся к первому подготовленному утверждению и пришел сюда для направления ... The table structure

Contents of the table

Итак, наконец, переписать ли запрос, перепроектировать таблицу или и то и другое ???

ОБНОВЛЕНИЕ: Фактическая проблема, с которой я сталкиваюсь, - это нарушение ограничения целостности в моем столбце sessionId. Я заканчиваю столкновением, когда печать совпадает с WHERE id=1, а sessionId совпадает с WHERE id=14 MySQL решает, что собирается обновить id=1, и вызывает ограничение целостности из-за дублирования sessionId. Как использовать от CASE до DELETE других соответствующих строк записи?

1 Ответ

0 голосов
/ 04 ноября 2019

Кажется, ты слишком много работаешь. Разве это не делает то, что вы хотите?

INSERT INTO prints (print,sessionId,lastUpdated)
      VALUES (:print,:sid,:lastC)
      ON DUPLICATE KEY UPDATE
           print = VALUES(print),
           sessionId = VALUES(sId),
           lastUpdated = VALUES(lastV)

Но ... Какой столбец UNIQUE (или PRIMARY)? IODKU должен знать, когда это «дубликат».

Скажем, это print. Если это так, то print = VALUES(print) не требуется.

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