简体   繁体   中英

Creating a trigger on insert on a table, that creates new rows on another table, according to amount of row on another (3rd) table

Assume the following structure:

Table1:

ID | name

Table2:

ID | name

Table3:

ID | table1_id | table2_id | value

I want to build a trigger, after insert to Table1 if id not exist, to create new rows for each row in Table2 inside Table3 with the corresponding IDs.

What I did so far is creating this logic in php, I have never created triggers this complex before so I don't really know how to approach this.

Example:

Customers Table after insert:
+----+------+
| ID | Name |
+----+------+
|  1 | Dan  |
+----+------+

Currency Table:
+----+------+
| ID | Name |
+----+------+
|  1 | USD  |
|  2 | EUR  |
+----+------+

Customers Currency Table after trigger
+----+---------------+-------------+-------+
| ID | customer_id   | currency_id | Value |
+----+---------------+-------------+-------+
|  1 |    1          |       1     | NULL  |
|  2 |    1          |       2     | NULL  |
+----+---------------+-------------+-------+

Another option that you can use is:

DELIMITER $$

DROP TRIGGER /*!50032 IF EXISTS */ `trg_bi`$$

CREATE TRIGGER `trg_bi` BEFORE INSERT ON `table1`
FOR EACH ROW
BEGIN
    INSERT INTO `table3` (`table1_id`, `table2_id`)
    SELECT NEW.`id`, `t2`.`id`
    FROM `table2` `t2`
    WHERE NOT EXISTS (SELECT NULL FROM `table1` `t1` WHERE `t1`.`id` = NEW.`id`);
END$$

DELIMITER ;

Here is validated by the id column table1 , but you can use the column you want to validate, however, depends as validate that there is no 'customer' in table1 .

SQL Fiddle example

To deal with this you need to use cursor in trigger, here is a nice tutorial on this http://www.mysqltutorial.org/mysql-cursor/

Now in your case I would suggest that the customer table id should be primary key auto incremented so that you always have unique value

So here how it should be

create table customer (id int primary key auto_increment , name varchar (100));

create table currency (id int primary key auto_increment, name varchar(100));
insert into currency (name) values ('USD'),('EUR') ;

create table customer_currency (id int primary key auto_increment, customer_id int , currency_id int , val varchar(100));

The trigger will be something as

delimiter //
create trigger customer_add after insert on customer
for each row 
begin
  DECLARE done INT DEFAULT FALSE;
  DECLARE currency_id int;
  DECLARE currency_val varchar(100);
  DECLARE cur CURSOR FOR SELECT id,name FROM currency;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  OPEN cur;
        ins_loop: LOOP
            FETCH cur INTO currency_id,currency_val;
            IF done THEN
                LEAVE ins_loop;
            END IF;
            INSERT INTO customer_currency (customer_id,currency_id,val) VALUES (NEW.id,currency_id,currency_val);
        END LOOP;
    CLOSE cur;
end ; //
delimiter ;

Now in mysql lets add a record on customer table

mysql> insert into customer (name) values ('Abhik') ;
Query OK, 1 row affected (0.02 sec)

Now lets see what is there in the customer_currency symbol

mysql> select * from customer_currency ;
+----+-------------+-------------+------+
| id | customer_id | currency_id | val  |
+----+-------------+-------------+------+
|  1 |           1 |           1 | USD  |
|  2 |           1 |           2 | EUR  |
+----+-------------+-------------+------+

In the trigger I am adding the currency value as well in the 3rd table if you do not want then can ignore that and it will become null.

You can write an after delete trigger on customer and delete the data from customer_currency where customer_id is the id of the deleted row in customer table.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM