Search code examples
mysqlviewtriggersinner-join

How do I create a trigger with Inner Joins


I'm trying to create a trigger to populate an aud Loan Table when there is an insert in the Loan table. I want this aud Table to have data from both the Loan table and another table, so I'm trying to set variables that get this data.

When creating the trigger I'm getting the error "Unknown system variable 'var1'"

This is the database layout:

https://cdn.discordapp.com/attachments/582912082450710528/583696750322253824/unknown.png

DELIMITER $$
CREATE TRIGGER Loan_Insert AFTER INSERT ON loan
FOR EACH ROW
BEGIN

SET var1 =
(SELECT loan_type.type_of_loan
FROM loan INNER JOIN loan_type ON
loan.loan_type_idloan_type = loan_type.idloan_type
AND
loan.loan_type_idapp_type = loan_type.idapp_type
WHERE loan.loan_type_idloan_type = new.loan_type_idloan_type
AND loan.loan_type_idapp_type = new.loan_type_idapp_type);

SET var2 =
(SELECT loan_type.app_type
FROM loan INNER JOIN loan_type ON
loan.loan_type_idloan_type = loan_type.idloan_type
AND
loan.loan_type_idapp_type = loan_type.idapp_type
WHERE loan.loan_type_idloan_type = new.loan_type_idloan_type
AND loan.loan_type_idapp_type = new.loan_type_idapp_type);


INSERT INTO Aud_Loan(bk_Loan, type_of_loan, type_of_loan_description, application_type,
application_type_description, insert_date)
VALUES(new.idloan, new.loan_type_idloan_type, var1, new.loan_type_idapp_type, var2,CURDATE());
END $$

Solution

    • Local variables must be DECLAREd. docs
    • When using SET, the right hand side must only return one value (single result with single field).

    In you particular case, you can probably tweak the queries used in your SET statements like this:

    SET var1 = (
       SELECT loan_type.type_of_loan
       FROM loan_type 
       WHERE loan_type.idloan_type = NEW.loan_type_idloan_type
          AND loan_type.idapp_type = NEW.loan_type_idapp_type
    );
    

    and you can probably even reduce it to one query with SELECT INTO:

    SELECT loan_type.type_of_loan, loan_type.app_type
    INTO var1, var2
    FROM loan_type 
    WHERE loan_type.idloan_type = NEW.loan_type_idloan_type
       AND loan_type.idapp_type = NEW.loan_type_idapp_type
    ;