Синтаксическая ошибка при использовании разделителей с Aurora Serverless MySQL 5.6

Я использую Aurora MySQL 5.6 без сервера для создания следующего триггера, который будет обновлять одну таблицу, когда данные вставляются в другую таблицу, но я получаю синтаксические ошибки, в частности, вокруг ключевого слова Delimiter.

DELIMITER $$
CREATE TRIGGER Create_Media_Like_Trigger AFTER INSERT ON MediaLike
FOR EACH ROW
BEGIN 
    IF NEW.likeType = 'LIKE' THEN
        UPDATE Media 
        SET Media.numLikes = Media.numLikes + 1 
        WHERE Media.mediaId = NEW.mediaId;
    ELSEIF NEW.likeType = 'DISLIKE' THEN
        UPDATE Media 
        SET Media.numLikes = Media.numLikes - 1 
        WHERE Media.mediaId = NEW.mediaId;
    ENDIF;
END $$
DELIMITER ;

Как я уже говорил выше, я получаю синтаксические ошибки вокруг Delimiter, специфичен ли этот вопрос для AWS и как я могу это исправить?

ОБНОВЛЕНИЕ с сообщениями об ошибках:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server 
version for the right syntax to use near 'DELIMITER $$ CREATE TRIGGER Create_Media_Like_Trigger 
AFTER INSERT ON MediaLike ' at line 1

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server 
version for the right syntax to use near 'ELSEIF NEW.likeType = 'DISLIKE' THEN UPDATE Media SET 
Media.numLikes = Media.num' at line 1

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server 
version for the right syntax to use near 'END $$' at line 1

3 ответа

Я потратил день, пытаясь понять это, так что надеюсь, это поможет кому-то там...

DELIMITERэто функция клиента, а не сервера MySQL. Редактор запросов RDS является клиентом, но он не поддерживает изменение разделителя, поэтому попытка запустить предоставленный вами скрипт не будет работать, поскольку в первый раз он увидит точку с запятой, он будет интерпретировать это как конец команды и завершится ошибкой. синтаксическая ошибка.

Итак, как создать что-то вроде хранимой процедуры, содержащей несколько операторов и точек с запятой? Вы должны создать его как.sql файл и отправьте его с помощью API данных из лямбда-функции или интерфейса командной строки.

Сначала создайте свой сценарий в .sql файл без каких-либо DELIMITER команды или альтернативные разделители.

Например: function.sql

CREATE PROCEDURE simpleproc (OUT param1 INT)
BEGIN
   SELECT COUNT(*) INTO param1 FROM t;
END

Затем запустите скрипт с помощью CLI следующим образом:

cat function.sql | xargs -0 aws rds-data execute-statement \
    --resource-arn arn:aws:rds:eu-west-1:xxx:cluster:cluster-name \
    --secret-arn arn:aws:secretsmanager:eu-west-1:xxx:secret:secret-name-xxx \
    --database "database_name" \
    --sql

В качестве альтернативы вы можете создать лямбда-функцию, которая читает файл и использует rds_client.execute_statement()для отправки скрипта на сервер через Data API. Но опять же, НЕ используйтеDELIMITERзаявление. Сервер видитBEGIN а также END строк и действует соответствующим образом, не изменяя разделитель.

Эта информация может не иметь прямого отношения к вопросу OP, но она тесно связана и может помочь кому-то еще в аналогичной ситуации (например, из поиска).

У меня был похожий CREATE FUNCTIONзапрос к базе данных Amazon Aurora Serverless MySQL 5.6 и получал те же синтаксические ошибки. Я использовал Table Plus (v2.9.1, build 264) в качестве приложения / клиента.

Решением было удалить 2x DELIMITERлиний. Приложение / клиент были достаточно умны, чтобы самостоятельно определять разделители.

После долгого возни с ключевым словом DELIMITER я нашел следующие работы.

Другие вопросы по тегам