Зачем получать синтаксическую ошибку в запросе MySQL Trigger? - PullRequest
0 голосов
/ 12 октября 2019

Я изучил триггеры в Oracle SQL, и не очень хорошо разбираюсь в MySQL. Я пытался преобразовать триггерную команду из Oracle в MySQL. Прежде всего, я не могу найти оператор when, вместо этого я нашел if else. Вот что я написал:

create trigger overdraft 
after update on account
for each row 
begin
    if account.balance < 0 then
        insert into borrower(select customer_name, account_number from depositor where new.account_number=depositor.account_number);
        insert into loan(select new.account_number, new.branch_name, new.balance);
        update account set balance = 0 where account.account_number = new.account_number;
    end if;
end;

Но я получаю три синтаксических ошибки: сначала в конце первого оператора вставки в левой скобке говорится: «Оператор неполный, ожидание:«, »». Два других на каждом из end s говорят "конец недействителен в этой позиции: ожидание BEGIN, EOF, ....". Что не так со мной код? Мне трудно разобраться.

Ответы [ 2 ]

0 голосов
/ 12 октября 2019

Есть несколько вещей. delimiter вероятно, является одним из них:

delimiter $$

create trigger overdraft before update on account
for each row 
begin
    if new.balance < 0 then
        insert into borrower (customer_name, account_number)  -- column list here
            select d.customer_name, d.account_number
            from depositor d
            where new.account_number = d.account_number;

        insert into loan (account_number, branch_name, balance)  -- column list here
            select new.account_number, new.branch_name, new.balance;

        set new.balance = 0;
    end if;
end;$$

delimiter ;

Примечания:

  • delimiter необходимо, чтобы определение триггера не заканчивалось на первой точке с запятой.
  • Ссылка в исходном if (account.balance) не понята, поскольку account не определено.
  • Требуется обновить баланс в строке с помощью триггера. Следовательно, вы хотите до обновления триггер, а не после обновления триггер.
  • При вставке строк в таблицу вы должны всегда перечислять вставляемые столбцы. Я размышлял над именами столбцов выше.
0 голосов
/ 12 октября 2019

Просто используйте разделитель следующим образом.

Я думал, что вы проверили все вставки. Вставка ino может быть похожа на пример, который я написал, но имена столбцов могут отличаться .

Как я уже описал, вы не можете использовать ту же таблицу в вашем триггере, которая запустила триггер. поэтому используйте установленный параметр, чтобы изменить баланс на 0

DELIMItER //
create trigger overdraft 
after update on account
for each row 
begin
    if account.balance < 0 then
        insert into borrower (customer_name, account_number) select customer_name, account_number from depositor
         where new.account_number=depositor.account_number;
        insert into loan (account_number, branch_name, balance) select new.account_number, new.branch_name, new.balance;
        set new.balance = 0;
    end if;
end;
DELIMItER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...