最近在寫項目是遇到了一個問題,建立一個新實體,同時還要與原先的舊實體完成綁定。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();