Синтаксическая ошибка при использовании разделителей с 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 я нашел следующие работы.