最近在写项目是遇到了一个问题,建立一个新实体,同时还要与原先的旧实体完成绑定。c++
原先实体为器具类别和器具实体,他们之间的关系为1:0..n
的关系,如图:sql
如今添加一个新实体:器具别名,他与器具类别之间关系为1..n :1
。与器具之间的关系为1:0..n
。数据库
为了保证明体之间的完整性,须要在建立新实体时,完成与原先实体的绑定。须要完成的任务为:编程
对于这种迭代的过程,天然而然的就想到了使用函数来实现。在上学期的数据库课程中,也学到sql编程的方法。数组
与函数的定义同样,首先是定义存储过程:函数
DELIMITER $$ CREATE PROCEDURE insert_alias() BEGIN ........ END$$ DELIMITER ;
咱们须要根据器具类别表中的数据来建立默认的器具别名,基本思路就是依次读取器具类别表中的记录,取name字段和id字段,建立到器具别名的表中,这时候就用到sql编程中的游标,相似与c++语言中的指针操做数组。fetch
declare cur cursor for select id,name from instrument_type; // 声明游标 查询instrument_type 取id,name 字段
在定义好游标后,能够使用fetch
打开游标取其中中的数据,取出数据后,游标会自动移动到下一条数据,因此能够写一个循环,依次把数据读出:spa
declare instrument_type_id bigint; // 声明变量 用于存储 器具类别id declare alias_name varchar(200); // 声明变量 用于存储 器具别名 declare done int default false; declare continue HANDLER for not found set done = true; // 当游标读至结尾时 done为true open cur; fetch cur into instrument_type_id,alias_name; // 打开游标读取记录 将id和name字段值 存储到变量中 while(not done) do INSERT INTO instrument_alias(name, instrument_type_id) VALUES(alias_name, instrument_type_id); // 根据器具类别名称和id 建立别名记录 UPDATE instrument i SET i.alias_id= LAST_INSERT_ID() WHERE i.instrument_type_id = instrument_type_id; // 用新建立的别名id更新到器具表中 fetch cur into instrument_type_id,alias_name; // 取下一条记录的数据 end while;
在写完后,使用CALL指令调用就好了。指针
CALL insert_alias();