#mysql #node.js
Вопрос:
Ошибка выполнения следующего кода в узле с npm mysql.
Язык кодирования: Node.js
База данных: MySQL
NPM: mysql
Запрос:
DELIMITER $
CREATE TRIGGER db_name.TS_UPDATE BEFORE UPDATE ON db_name.Ticket_Service__c
FOR EACH ROW BEGIN
IF (NEW.Service_Date_Time__c <> OLD.Service_Date_Time__c || NEW.Status__c <> OLD.Status__c || NEW.Worker__c <> OLD.Worker__c || NEW.Service__c <> OLD.Service__c || NEW.Duration__c <> OLD.Duration__c || NEW.Net_Price__c <> OLD.Net_Price__c || NEW.IsDeleted <> OLD.IsDeleted) THEN
INSERT INTO db_name.Appointment_History__c SET Appt_Ticket__c = NEW.Appt_Ticket__c, Change__c = JSON_OBJECT('table', 'Ticket_Service__c', 'type', 'UPDATE', 'new', JSON_OBJECT('Service_Date_Time__c', NEW.Service_Date_Time__c, 'Status__c', NEW.Status__c, 'Worker__c', NEW.Worker__c, 'Service__c', NEW.Service__c, 'Duration__c', NEW.Duration__c, 'Net_Price__c', NEW.Net_Price__c, 'IsDeleted', NEW.IsDeleted), 'old', JSON_OBJECT('Service_Date_Time__c', OLD.Service_Date_Time__c, 'Status__c', OLD.Status__c, 'Worker__c', OLD.Worker__c, 'Service__c', OLD.Service__c, 'Duration__c', OLD.Duration__c, 'Net_Price__c', OLD.Net_Price__c, 'IsDeleted', OLD.IsDeleted)), CreatedById = NEW.LastModifiedById, CreatedDate = NEW.LastModifiedDate;
END IF;
END$
DELIMITER ;
Ошибка: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DELIMITER $$
Если я выполню запрос без РАЗДЕЛИТЕЛЯ, как показано ниже
CREATE TRIGGER db_name.TS_UPDATE BEFORE UPDATE ON db_name.Ticket_Service__c
FOR EACH ROW BEGIN
IF (NEW.Service_Date_Time__c <> OLD.Service_Date_Time__c || NEW.Status__c <> OLD.Status__c || NEW.Worker__c <> OLD.Worker__c || NEW.Service__c <> OLD.Service__c || NEW.Duration__c <> OLD.Duration__c || NEW.Net_Price__c <> OLD.Net_Price__c || NEW.IsDeleted <> OLD.IsDeleted) THEN
INSERT INTO db_name.Appointment_History__c SET Appt_Ticket__c = NEW.Appt_Ticket__c, Change__c = JSON_OBJECT('table', 'Ticket_Service__c', 'type', 'UPDATE', 'new', JSON_OBJECT('Service_Date_Time__c', NEW.Service_Date_Time__c, 'Status__c', NEW.Status__c, 'Worker__c', NEW.Worker__c, 'Service__c', NEW.Service__c, 'Duration__c', NEW.Duration__c, 'Net_Price__c', NEW.Net_Price__c, 'IsDeleted', NEW.IsDeleted), 'old', JSON_OBJECT('Service_Date_Time__c', OLD.Service_Date_Time__c, 'Status__c', OLD.Status__c, 'Worker__c', OLD.Worker__c, 'Service__c', OLD.Service__c, 'Duration__c', OLD.Duration__c, 'Net_Price__c', OLD.Net_Price__c, 'IsDeleted', OLD.IsDeleted)), CreatedById = NEW.LastModifiedById, CreatedDate = NEW.LastModifiedDate;
END IF;
Я получил следующую ошибку
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 5
Комментарии:
1. По моему опыту, почти невозможно исправить синтаксис SQL для адаптера mysql в javascript/Node. Вместо этого я бы изучил ORM, например, TypeORM, Возражение или продолжение.
Ответ №1:
DELIMITER
распознается только клиентом командной строки mysql. Его единственная цель-помочь устранить двусмысленность между точками с запятой, которые находятся внутри тела сохраненной процедуры, и точка с запятой, которая завершает весь CREATE
оператор.
Так как большинство API запросов программирования по умолчанию не поддерживают многозадачность, в этом нет необходимости DELIMITER
. Даже если тело вашего триггера может содержать точки с запятой, SQL-анализатор сервера знает, что нужно просто продолжать читать до последнего END
.
Поэтому не используйте DELIMITER
, если вы выполняете SQL-запросы программно.
Комментарии:
1. Спасибо, Билл. Но когда я выполняю запрос без разделителя, если условие выдает ошибки.