【问题标题】:Trigger update the same table with data from another table after insert插入后触发器用另一个表中的数据更新同一个表
【发布时间】:2016-10-02 22:41:20
【问题描述】:

我有两个不相关的表 tbl_A 和 tbl_B

tbl_A

+----+---------------------+------+
| id | url                 | slug |
+----+---------------------+------+
|  1 | http://example.com/ | 3qqd |           
|  2 | http://example.com/ | t8af |           
|  3 | http://example.com/ | sjim |           
|  4 | http://example.com/ | awfo |           
|  5 | http://example.com/ | 6myy |           
+----+---------------------+------+

tbl_A 描述:

+---------------------+---------------------+------+-----+---------------------+----------------+
| Field               | Type                | Null | Key | Default             | Extra          |
+---------------------+---------------------+------+-----+---------------------+----------------+
| id                  | bigint(20) unsigned | NO   | PRI | NULL                | auto_increment |
| url                 | text                | YES  |     | NULL                |                |
| slug                | varchar(255)        | YES  | MUL | NULL                |                |
+---------------------+---------------------+------+-----+---------------------+----------------+

还有一张桌子:

tbl_B

+----+---------------------+---------------------+------+           
| ID | user_name           | url                 | slug |
+----+---------------------+---------------------+------+
|  1 | john.reese          | NULL                | NULL |       
+----+---------------------+---------------------+------+

tbl_B 描述:

+---------------------+---------------------+------+-----+---------------------+----------------+
| Field               | Type                | Null | Key | Default             | Extra          |
+---------------------+---------------------+------+-----+---------------------+----------------+
| ID                  | bigint(20) unsigned | NO   | PRI | NULL                | auto_increment |
| user_name           | varchar(60)         | NO   | MUL |                     |                |
| url                 | text                | YES  |     | NULL                |                |
| slug                | varchar(255)        | YES  | MUL | NULL                |                |
+---------------------+---------------------+------+-----+---------------------+----------------+

tbl_A.id 与 tbl_B.ID 无关。

tbl_B.ID 是用户 ID 字段,并在新用户注册时自动填充。这样 tbl_B.ID 会自动插入一行作为用户寄存器,tbl_B.ID 值会自动递增。

另一方面,tbl_A 已经存在,包含所有细节。

我想要实现的目标:每当一个新用户注册并且用户 ID 是 INSERT into tbl_B.ID,同时它应该触发更新 tbl_B.user 和 tbl_B.slug 的值取自 tbl_A.user 和 tbl_A.slug.

结果:添加ID 1后

+----+---------------------+---------------------+------+           
| ID | user_name           | url                 | slug |
+----+---------------------+---------------------+------+
|  1 | john.reese          | http://example.com/ | 3qqd |       
+----+---------------------+---------------------+------+

希望我能解释一下。我尝试使用触发器但迷路了,我是mysql新手,请多多包涵。

drop trigger if exists bi_tbl_B $$
delimiter $$

create trigger bi_tbl_B before insert on tbl_B
for each row begin
   UPDATE tbl_B
     SET url = url +
       (SELECT url
          FROM tbl_A
          WHERE id = NEW.id)
    WHERE ID = NEW.ID;

end;
$$

delimiter ; 

我不知道这是否可能,或者我应该尝试相反的方式。

在 tbl_A 中添加一个字段 user_id,在 tbl_B 上添加一个 AFTER INSERT 使用来自 tbl_B.ID 的用户 ID 更新 tabl_A.user_id 列

我愿意接受建议,如果不触发则程序。

【问题讨论】:

    标签: mysql sql triggers


    【解决方案1】:

    有可能做到这一点,只是不是你正在尝试的方式。在插入前触发器中,您可以通过更改 NEW.field_name 变量来更改要插入的值。

    drop trigger if exists bi_tbl_B $$
    delimiter $$
    
    create trigger bi_tbl_B before insert on tbl_B
    for each row begin
       DECLARE v_slug as varchar(255);
       DECLARE v_url as text;
       SELECT url, slug INTO v_url, v_slug FROM tbl_A WHERE id = NEW.id;
       NEW.url=v_url;
       NEW.slug=v_slug;
    end;
    $$
    
    delimiter ; 
    

    【讨论】:

    • 非常感谢,我现在就去试试。只是为了确保,每次插入新 ID tbl_B 时,这是否会更新用户,在 tbl_B 上使用该 ID 的新值,请原谅我的无知,尝试尽可能多地学习
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2020-08-23
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多