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 陣列訪問有較好的記憶體相聯性,而鍊錶則不能保...