SQL: ошибка 1064 в моем запросе, я не могу найти почему - PullRequest
0 голосов
/ 20 января 2020

У меня есть это для создания триггера:

CREATE TRIGGER `create_account`
   AFTER INSERT
   ON
       `Client`
   FOR EACH ROW
BEGIN
   SET
       @lastID = (
           SELECT C.idClient
           FROM CLIENT as C
           ORDER BY C.idClient
               DESC
           LIMIT 1
       );
       SET 
       @iban = ('FR1330010000019111679074293');

   SELECT IF(
                  LENGTH(@iban) < 11,
                  CONCAT(
                          REPEAT('0', (11 - LENGTH(@iban))),
                          @iban
                      ),
                  @iban = @iban
              );
   INSERT INTO `Compte`(`idCompte`,
                        `numeroCompte`,
                        `soldeCompte`,
                        `idClientCompte`,
                        `statusCompte`)
   VALUES (NULL, @iban, '0', @lastId, '0');
END

И MySQL возвращает меня

1064 - Синтаксическая ошибка рядом с '' в строке 14 "

У кого-то есть объяснения?

Спасибо всем. Я все еще работаю над его решением.

Ответы [ 3 ]

0 голосов
/ 20 января 2020

Вы можете попробовать приведенный ниже фрагмент кода, в основном вам нужно использовать DELIMITER, иначе mysql начнет обработку с первого ;. Кроме того, вы не можете использовать операторы select в триггерах, вы всегда должны использовать select into и, наконец, я думаю, что вы if операторы не работают должным образом, они всегда возвращают 1.

   DELIMITER $$
CREATE TRIGGER `create_account` AFTER INSERT ON `Client` FOR EACH ROW BEGIN
      SELECT C.idClient into @lastID FROM Client as C ORDER BY C.idClient DESC LIMIT 1;
      SELECT 'FR1330010000019111679074293' into @iban;

      SELECT IF(
               LENGTH(@iban) < 11,
               CONCAT(
                       REPEAT('0', (11 - LENGTH(@iban))),
                       @iban
                   ),
               @iban = @iban
           ) into @iban;

      INSERT INTO `Compte`(`idCompte`,
                        `numeroCompte`,
                        `soldeCompte`,
                        `idClientCompte`,
                        `statusCompte`)
      VALUES (NULL, @iban, '0', @lastId, '0');

END$$
DELIMITER ;
0 голосов
/ 20 января 2020

Триггер INSERT без ссылки new вполне подозрительно.

Ваш вопрос должен объяснить логику c, которую вы хотите реализовать, но я думаю, что это:

CREATE TRIGGER `reate_account
    AFTER INSERT ON Client
    FOR EACH ROW
BEGIN
    SET @iban = 'FR1330010000019111679074293';

    INSERT INTO Compte (numeroCompte, soldeCompte, idClientCompte, statusCompte)
        SELECT LPAD(@iban, 11, '0'), '0', new.idClient, '0'
        FROM DUAL
        WHERE LENGTH(@iban) < 11;
END;

Ваш триггер гораздо сложнее, чем необходимо.

0 голосов
/ 20 января 2020

Вы хотели что-то подобное? Если да, то дополнительная информация: https://www.w3resource.com/mysql/control-flow-functions/if-function.php

Функция IF не нуждается в предложении SELECT. Я проверил это здесь: ТЕСТ

CREATE TRIGGER `create_account`
   AFTER INSERT
   ON
       `Client`
   FOR EACH ROW
BEGIN
   SET
       @lastID = (
           SELECT C.idClient
           FROM Client C
           ORDER BY C.idClient
               DESC
           LIMIT 1
       );
       SET 
       @iban = ('FR1330010000019111679074293');

   set @iban = IF(
                  LENGTH(@iban) < 11,
                  CONCAT(
                          REPEAT('0', (11 - LENGTH(@iban))),
                          @iban
                      ),
                  @iban
              );


   INSERT INTO Compte(idCompte,
                      numeroCompte,
                      soldeCompte,
                      idClientCompte,
                      statusCompte)
   VALUES (NULL, @iban, '0', @lastId, '0');

END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...