harristars Ответов: 2

Как я могу написать триггер обновления между двумя таблицами


у меня есть две таблицы, одна называется неплательщиков и таблица пользователей .неплательщиков имеет mypin и debt_amount и пользователей mypin и должника.я хочу, чтобы триггер, который будет обновлять должника в таблице "пользователи", если mypin существует в таблице users, где debt_amount=0 в неплательщиков .триггер ввода нулевого значения в должника, если mypin неплательщиков в таблице имеет нулевую ценность в debt_amount.
ссылка на базу данных

Что я уже пробовал:

CREATE TABLE users (
    user_id INT AUTO_INCREMENT,
    debtor int(10),
    myPIN varchar(255),
    PRIMARY KEY (user_id)
)  ENGINE=INNODB;

CREATE TABLE defaulters (
    defaulters_id INT AUTO_INCREMENT,
    myPIN varchar(255),
    debt_amount varchar(255),
    PRIMARY KEY (defaulters_id)
)  ENGINE=INNODB; 


это то, что я пробовал, и это дает ошибку
CREATE TRIGGER `after_update_defaulters` AFTER INSERT ON `defaulters`
AFTER insert on defaulters
FOR EACH ROW 
BEGIN
       IF ( EXISTS (
            SELECT DISTINCT `myPIN` FROM defaulters WHERE `Debt_Amount` = 0;
           )      
    )
    THEN
        UPDATE users 
        SET debtor = 0;
        WHERE myPIN = NEW.myPIN;
     END IF;
END

phil.o

Пожалуйста, также предоставьте сообщение об ошибке.

harristars

#1064 - у вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с 'AFTER insert on defaulters
ДЛЯ КАЖДОЙ СТРОКИ
НАЧАТЬ
ЕСЛИ ( СУЩЕСТВУЕТ (
- на линии 2

2 Ответов

Рейтинг:
1

phil.o

Попробуйте удалить точку с запятой ; в конце концов, SELECT заявление:

IF ( EXISTS (
   SELECT DISTINCT `KRAPIN` FROM defaulters WHERE `Debt_Amount` = 0
)
Вам нужны только точки с запятой, если вы выдаете несколько операторов рядом друг с другом. Вот здесь то SELECT предложение принимается в качестве входного аргумента для EXISTS заявление.

Источник: 13.2.11.6 подзапросы с EXISTS or NOT EXISTS | справочное руководство MySQL 8.0[^]


harristars

даже после удаления точки с запятой я получаю ту же ошибку.
#1064 - у вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с 'AFTER insert on defaulters
ДЛЯ КАЖДОЙ СТРОКИ
НАЧАТЬ
ЕСЛИ ( СУЩЕСТВУЕТ (
- на линии 2

phil.o

Убрать второй AFTER insert on `defaulters`.

harristars

я удалил но это дает мне эту ошибку
#1064 - у вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом " в строке 10

phil.o

Пожалуйста, посмотрите мое решение и примените его к указанной строке.
У меня складывается впечатление, что вы не пытаетесь понять сообщения об ошибках.

harristars

я включил разделитель // в начале, а также в конце // и теперь я получаю другой
#1064 - у вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MariaDB для правильного синтаксиса для использования рядом с 'WHERE KRAPIN = NEW.Крапин;
КОНЕЦ, ЕСЛИ;
Конец' в строке 11

phil.o

Просто удалите все точки с запятой.

harristars

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

DELIMITER //
CREATE TRIGGER `after_update_debt_defaulters` AFTER INSERT ON `defaulters`
 FOR EACH ROW BEGIN
       IF ( EXISTS (
            SELECT DISTINCT `KRAPIN` FROM defaulters WHERE `Debt_Amount` = '0'
           )   
       )
        THEN
            UPDATE users 
            SET users.debtor = '0'
            WHERE KRAPIN = NEW.KRAPIN;
        END IF;
END

Рейтинг:
1

harristars

это работает идеально

DELIMITER //
CREATE TRIGGER `after_update_debt_defaulters` AFTER UPDATE ON `defaulters`
 FOR EACH ROW BEGIN
       IF ( EXISTS (
            SELECT DISTINCT `KRAPIN` FROM defaulters WHERE defaulters.Debt_Amount = '0'
           )   
       )
        THEN
            UPDATE users 
            SET users.debtor = '0'
            WHERE KRAPIN = NEW.KRAPIN;
        END IF;
END