mysql 从另一个 table 更新列后触发
mysql trigger after update column from another table
我有 2 个表格,如下所示。
我想为 table_one 创建一个触发器。当更改 table_one 中的用户名时,从 table_two 用户值更新 user_id 值。
table_one:
+--------------+----------+
| user_id | username |
+--------------+----------+
| 15 | robin |
| 46 | albert |
+--------------+----------+
table_two:
+--------------+----------+
| id | user |
+--------------+----------+
| 1 | john |
| 2 | jack |
| 3 | robin |
| 4 | kylie |
| 5 | robert |
| 6 | albert |
| 7 | jay |
+--------------+----------+
提前致谢
执行 BEFORE UPDATE
触发器,而不是 AFTER UPDATE
触发器。
(我不认为在 AFTER UPDATE 触发器中修改已更新的行是可能的,这触发了触发器。我可能是错的,但我就是想不通那是怎么回事会工作。)
这是 table_one
上的 BEFORE UPDATE 触发器的演示,它根据查询的结果为 user_id
列(正在更新的行)分配一个值:
DELIMITER $$
CREATE TRIGGER ...
BEFORE UPDATE ON table_one
BEGIN
# local variable we will temporarily store a value fetched from a query
DECLARE li_new_id BIGINT DEFAULT NULL; # match datatype of table_two.id
# lookup `id` value from `table_two` with a SQL query
SELECT s.id
INTO li_new_id
FROM table_two s
WHERE s.user = NEW.username
ORDER BY s.id
LIMIT 1 ;
# assign the value we fetched to the `user_id` column of the row being updated
SET NEW.user_id := li_new_id ;
END$$
DELIMITER ;
请注意,如果查询未找到匹配的行,局部变量将具有 NULL 值。因此 SET 语句会将 NULL 分配给 user_id
列。触发器中没有检查我们分配的值不会违反约束(NOT NULL、UNIQUE、FOREIGN KEY)。
我有 2 个表格,如下所示。
我想为 table_one 创建一个触发器。当更改 table_one 中的用户名时,从 table_two 用户值更新 user_id 值。
table_one:
+--------------+----------+
| user_id | username |
+--------------+----------+
| 15 | robin |
| 46 | albert |
+--------------+----------+
table_two:
+--------------+----------+
| id | user |
+--------------+----------+
| 1 | john |
| 2 | jack |
| 3 | robin |
| 4 | kylie |
| 5 | robert |
| 6 | albert |
| 7 | jay |
+--------------+----------+
提前致谢
执行 BEFORE UPDATE
触发器,而不是 AFTER UPDATE
触发器。
(我不认为在 AFTER UPDATE 触发器中修改已更新的行是可能的,这触发了触发器。我可能是错的,但我就是想不通那是怎么回事会工作。)
这是 table_one
上的 BEFORE UPDATE 触发器的演示,它根据查询的结果为 user_id
列(正在更新的行)分配一个值:
DELIMITER $$
CREATE TRIGGER ...
BEFORE UPDATE ON table_one
BEGIN
# local variable we will temporarily store a value fetched from a query
DECLARE li_new_id BIGINT DEFAULT NULL; # match datatype of table_two.id
# lookup `id` value from `table_two` with a SQL query
SELECT s.id
INTO li_new_id
FROM table_two s
WHERE s.user = NEW.username
ORDER BY s.id
LIMIT 1 ;
# assign the value we fetched to the `user_id` column of the row being updated
SET NEW.user_id := li_new_id ;
END$$
DELIMITER ;
请注意,如果查询未找到匹配的行,局部变量将具有 NULL 值。因此 SET 语句会将 NULL 分配给 user_id
列。触发器中没有检查我们分配的值不会违反约束(NOT NULL、UNIQUE、FOREIGN KEY)。