INSERT ... NOT EXISTS работает на MAMP, но не работает на реальном сервере - PullRequest
1 голос
/ 11 марта 2020

Я пытаюсь перенести свой сайт, который я разрабатывал локально на сервере MAMP, на работающий сервер. Все запросы работают на MAMP, как и ожидалось. На работающем сервере я получаю сообщения об ошибках по запросу «INPUT ... NOT EXISTS».

Сервер MAMP: PHP - 7.4.2 MySQL - 5.7.26 InnoDB

Живой сервер: PHP - 7,4 MariaDB - 10,2 InnoDB

структура и первичные ключи одинаковы - проверены все таблицы

$ user_id, $ id, $ date, $ summ - переменные , который я получаю с помощью метода POST.

Запрос:

if ($result = $link->prepare("INSERT INTO sb_user_checks (user_id, check_id, date_update, summ, updated_by) 
    SELECT ?, ?, ?, ?, 'You'
    WHERE NOT EXISTS (SELECT date_update FROM sb_user_checks WHERE user_id=? AND check_id=? AND date_update=?)
    ")) { 
        $result->bind_param('iisiiis', $user_id, $id, $date, $summ, $user_id, $id, $date);
        $result->execute();
        if (mysqli_affected_rows($link)>0) {echo 'added';}
        $result->close();
    } 

Я получаю следующую ошибку:

# 1064 - У вас есть ошибка в вашем SQL синтаксисе; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса, который можно использовать рядом с «ГДЕ НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ date_update ОТ sb_user_checks ГДЕ user_i») в строке 3 Это связано с версией MySQL или это неверный запрос? Но, опять же, он работает правильно на MAMP.

1 Ответ

1 голос
/ 11 марта 2020

В MySQL, и, как я полагаю, MariaDB, запрос может использовать DUAL в качестве замены таблицы, когда синтаксис требует этого, но общий лог c этого не делает. Например, в этом случае:

SELECT ?, ?, ?, ?, 'You'
FROM DUAL
WHERE NOT EXISTS ...

DUAL действует аналогично одной строке, без таблицы столбцов; и на самом деле предназначен только как сценарий ios, как это. Эти факторы имеют ряд последствий:

  • Он не может использоваться с SELECT *
  • Он не может быть псевдонимом
  • К нему нельзя присоединиться.
  • подробнее ... эти ограничения - только те, которые я обнаружил при запуске быстрых тестов вручную, когда писал этот ответ.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...