数据库编程实战

最近在写项目是遇到了一个问题,建立一个新实体,同时还要与原先的旧实体完成绑定。c++

原先实体为器具类别和器具实体,他们之间的关系为1:0..n 的关系,如图:sql

image.png

如今添加一个新实体:器具别名,他与器具类别之间关系为1..n :1。与器具之间的关系为1:0..n 数据库

image.png

为了保证明体之间的完整性,须要在建立新实体时,完成与原先实体的绑定。须要完成的任务为:编程

  1. 根据已有的器具类别建立默认的同名器具别名,例如根据游标尺类别生成游标尺别名。
  2. 将器具的别名绑定到器具类别默认的别名上,例如游标尺1的别名为游标尺别名。

解决方法

对于这种迭代的过程,天然而然的就想到了使用函数来实现。在上学期的数据库课程中,也学到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();
相关文章
相关标签/搜索