數據庫編程實戰

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