第13章 MySQL高階程式設計

2022-08-20 08:15:14 字數 3349 閱讀 7339

1.事務:乙個或一系列的查詢;

2.使用事務安全的**型別(通過innodb):

①關閉自動提交: set autocommit=0; 

//若自動提交被開啟,須使用如下語句開始乙個事務:

//  start transaction;  若自動提交是關閉的則不需要此句

②完成組成事務的語句輸入後,提交給資料庫:  commit;

③回到資料庫之前的狀態:  rollback;

④將**轉換成innodb**(之前是myisam**):

alter table orders type=innodb;

alter table order_items type=innodb;

//轉成innodb**後,需要再使用commit;語句才能完成提交到資料庫的行為

3.(innodb下)新增外來鍵:

要先建立乙個使用外來鍵的**:

如:create table order_itemstype=innodb;

再使用alter table語句新增外來鍵:

如:  alter table order_items type=innodb;

alter table order_items

add foreign key (orderid) references orders(orderid);

//orderid列是乙個外來鍵,包含orders**中的orderid列值

4.儲存:

①宣告乙個儲存過程:

# basic_stored_procedure.sql

# basic stored

procedure

example

delimiter

//# 分隔符

//替換; 使得在儲存過程中使用分號分隔符

create

procedure total_orders (out total float

)# total_orders是儲存過程名稱

# out表示該引數將被傳出或返回(對應的是in)

# total是被傳遞的引數,若有多個引數則用逗號分隔

# float是引數的型別

begin

select

sum(amount) into total from

orders;

end//

delimiter;

# 過程宣告完成,將分隔符重新設定為分號

過程宣告結束後,使用call關鍵字:

如: call total_orders(@t);

//呼叫total_orders過程並傳入乙個用來儲存結果的變數@t

//檢視結果: select @t;

②宣告乙個儲存函式:

# basic_function.sql

# basic syntax

tocreate a function

delimiter

//create

function add_tax (price float) returns

float

begin

declare tax float

default

0.10

; # declare用於在begin...end中宣告區域性變數

return price*(1

+tax);

end//

delimiter;

檢視結果: select add_tax(100); //100是傳過去的price值

③檢視定義儲存過程和儲存函式:

show create procedure total_orders;

show create function add_tax;

刪除之:

drop procedure total_orders;

drop function add_tax;

④游標、控制結構:

# control_structures_cursors.sql

# procedure

to find the orderid with

the largest amount

# could be done

with

max, but just to illustrate stored procedure

principles

delimiter

//create

procedure largest_order(out largest_id int

)begin

declare this_id int

; #當前行的orderid值

declare this_amount float

; #當前行的amount值

declare l_amount float

default

0.0; #最大的訂單金額

declare l_id int

; #最大訂單金額對應的id

declare done int

default

0; #迴圈標記

# 宣告控制代碼,類似於儲存過程中的乙個異常

#(該控制代碼將在sqlstate

'02000

'語句被執行時呼叫)

declare

continue handler for sqlstate '

02000

'set done =1;

# 游標c1,類似於乙個陣列從乙個查詢獲得結果集

declare c1 cursor

forselect orderid, amount from

orders;

open

c1; #open才是真正開始執行查詢

repeat

fetch c1 into

this_id, this_amount;

ifnot done then

if this_amount>l_amount then

set l_amount=

this_amount;

set l_id=

this_id;

endif

;

endif

; until done

endrepeat;

close

c1;

set largest_id=

l_id;

end//

delimiter;

呼叫過程: call largest_order(@l);

檢視結果: select @l;

UNIX高階程式設計 第13章 守護程序

請移步到這 13.2 守護程序的特徵 注意,大多數守護程序都以超級使用者 root 特權執行。所有的守護程序都沒有控制終端,其終端名設定為問號。核心守護程序以無控制終端方式啟動。使用者層守護程序缺少控制終端可能是守護程序呼叫了setsid的結果。大多數使用者層守護程序都是程序組的組長程序以及會話的首...

UNIX高階環境程式設計 第13章 守護程序

守護程序 沒有控制終端,長期執行在後台的程序 void daemonize const char cmd else if pid 0 呼叫setsid以建立乙個新會話 使呼叫程序 a.成為新會話的首程序,b.成為乙個新程序組的組長程序,c.沒有控制終端。setsid struct sigaction...

程式設計珠璣第13章

正文 為了解決在12章中的隨機數問題,本章中的目的是對檢視是否在陣列中的情況進行處理。那麼這裡採用了以下幾種方法 1 採用c 的set 2 採用陣列 3 採用鍊錶,順序搜尋,插入時不用移動。結果是陣列的比鍊錶的要快 1 鍊錶需要讀入的記憶體數比陣列大 2 陣列訪問有較好的記憶體相聯性,而鍊錶則不能保...