如何编写mysql触发器函数,将一些id传递给另一个表并更新当前表列

u5rb5r59  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(257)

我有单元格表和区域表。当我将数据插入单元格表(仅单元格id、单元格名称和区域id)时,它将触发,并从区域表中查找区域id,同时更新单元格表的区域id值。belove是我的单元格表和区域表;

+---------+-----------+-----------+-------------+
| cell_id | cell_name | region_id | district_id |
+---------+-----------+-----------+-------------+
|  000001 | cell1     |         1 |             |
|  000006 | cell6     |         6 |             |
|  000005 | cell5     |         5 |             |
|  000004 | cell4     |         4 |             |
|  000003 | cell3     |         3 |             |
+---------+-----------+-----------+-------------+

这是我的区域表;

+----+--------------+-------------+
| id | region_name  | district_id |
+----+--------------+-------------+
|  1 | fort         |           2 |
|  2 | hatton       |           4 |
|  3 | nugegoda     |           2 |
|  4 | wattala      |           2 |
|  5 | Nawala       |           2 |
|  6 | Dickoya      |           4 |
|  7 | kottegallaTT |           3 |
|  8 | Mabola       |           2 |
+----+--------------+-------------+
yb3bgrhw

yb3bgrhw1#

试试这个:

create trigger set_district_id
after insert
on cell_table
referencing new as NEW
ON EACH ROW
BEGIN
 a number;
 select district_id into a from region_table where 
 id=:NEW.region_id;
 update cell_table set district_id=a where region_id=:NEW.region_id;
END;
/
r3i60tvu

r3i60tvu2#

其实你不需要这么做。
单元格表中的地区id列是多余的。如果您只是想从region表中复制它,那么就不要这样做:这样的复制数据违反了关系数据库的原则。它会让你的数据去标准化。想一想-如果您更改region表以更改区域所属的区域(例如,由于区域的重新组织),您不想也查找和更改该区域的所有单元格行-这只是浪费时间。一个外键关系的全部目的,就像你在单元格和区域之间建立的关系,是为了你不必把区域相关的信息复制到单元格级别。
相反,如果您需要知道一个单元格属于哪个区域,只需编写一个连接到region表的查询,然后就可以包含district列。
例如

SELECT *
FROM
  cell
  INNER JOIN region
    ON cell.region_id = region.id

将获取所有单元格并在输出中包含区域id

相关问题