【问题标题】:SQL trigger with join and If statementSQL trigger with join and If statement
【发布时间】:2022-12-02 06:32:35
【问题描述】:

I am using two tables. The first is the invoice table the second is the payments.

create table invoice(
invoice_id DECIMAL(3),
invoice_date DATE,
due_date DATE,
overdue_fee DECIMAL(10,2),
amt_due_left decimal(12,2),
PRIMARY KEY(invoice_id));

INSERT INTO invoice VALUES 
(1,'2020-11-02','2020-11-05',15,120.24),
(2,'2020-11-02','2020-11-05',35,200.00),
(3,'2020-11-02','2020-11-05',150,1300.00),
(4,'2020-11-02','2020-11-05',120,1200.00);

create table payments(
payment_id int, 
invoice_id decimal(3),
payment_type varchar(40),
amnt_recived decimal(12,2),
payment_date Date,
primary key (payment_id),
CONSTRAINT fk_has_invoice_id
FOREIGN KEY(invoice_id)REFERENCES invoice(invoice_id));

insert into payments values
(1,1,"credit_card",120.24,'2020-11-03' ),
(2,2,"cash",200,'2020-11-03' ),
(3,3,"debit",1200.00,'2020-11-03' ),
(4,4,"cash",1200.00,'2020-11-03' );

After creating these two tables I was wanting a trigger that would be able to check to see if invoices "due_date" had passed at the time of the payments "payment_date". If so it would then add invoices "overdue_fee" to invoices "amt_due_left" and set invoices "overdue_fee" equal to zero. this is so if you enter another late payment it dose not double up the invoices "overdue_fee"

so far this trigger works but I cannot figure out the if statement to asses only the rows with payments "payment_date" passed invoices "due_date".

DELIMITER $$
CREATE TRIGGER Late_payment after insert ON payments FOR EACH ROW
BEGIN
   UPDATE invoice
    set
    amt_due_left = amt_due_left + overdue_fee,
    overdue_fee = 0 
    where 
    new.payment_date > invoice.due_date;
END $$ 
DELIMITER ;

This was my best attempt for over 5 hours. If another more enlightened would help me that would be much appreciated. also, I know the need for a shorthand in my example is not necessary and I intend on going back and redoing all attribute names at the end of the project.

DELIMITER $$
CREATE TRIGGER Late_payment after insert ON payments FOR EACH ROW
BEGIN
   UPDATE invoice
   If new.payment_date > invoice.due_date;
    set
    amt_due_left = amt_due_left + overdue_fee,
    overdue_fee = 0 
  
    where 
    new.payment_date > invoice.due_date;
    
END 
DELIMITER ;

【问题讨论】:

    标签: mysql sql mysql-workbench


    【解决方案1】:

    You need to inlcude the invoice_id to get the correct row

    i change invoice number 3 to show you thatot works

    create table invoice(
    invoice_id DECIMAL(3),
    invoice_date DATE,
    due_date DATE,
    overdue_fee DECIMAL(10,2),
    amt_due_left decimal(12,2),
    PRIMARY KEY(invoice_id));
    
    INSERT INTO invoice VALUES 
    (1,'2020-11-02','2020-11-05',15,120.24),
    (2,'2020-11-02','2020-11-05',35,200.00),
    (3,'2020-11-02','2020-11-02',150,1300.00),
    (4,'2020-11-02','2020-11-05',120,1200.00);
    
    create table payments(
    payment_id int, 
    invoice_id decimal(3),
    payment_type varchar(40),
    amnt_recived decimal(12,2),
    payment_date Date,
    primary key (payment_id),
    CONSTRAINT fk_has_invoice_id
    FOREIGN KEY(invoice_id)REFERENCES invoice(invoice_id));
    
    
    
    Records: 4  Duplicates: 0  Warnings: 0
    
    CREATE TRIGGER Late_payment after insert ON payments FOR EACH ROW
    BEGIN
       UPDATE invoice
        set
        amt_due_left = amt_due_left + overdue_fee,
        overdue_fee = 0 
        where 
        new.payment_date > invoice.due_date
      AND new.invoice_id = invoice.invoice_id;
    END
    
    insert into payments values
    (1,1,"credit_card",120.24,'2020-11-03' ),
    (2,2,"cash",200,'2020-11-03' ),
    (3,3,"debit",1200.00,'2020-11-03' ),
    (4,4,"cash",1200.00,'2020-11-03' );
    
    Records: 4  Duplicates: 0  Warnings: 0
    
    SELECT * FROM invoice
    
    invoice_id invoice_date due_date overdue_fee amt_due_left
    1 2020-11-02 2020-11-05 15.00 120.24
    2 2020-11-02 2020-11-05 35.00 200.00
    3 2020-11-02 2020-11-02 0.00 1450.00
    4 2020-11-02 2020-11-05 120.00 1200.00

    fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 2010-12-13
      • 2013-09-23
      相关资源
      最近更新 更多