MySQL操作
修改MySQL的結(jié)束符
有時(shí)候在使用一個(gè)特殊SQL的時(shí)候需要使用;,但是;在MySQL中會(huì)被當(dāng)做結(jié)束符,這樣我們就需要臨時(shí)修改MySQL中的結(jié)束符。
delimiter $ ##他的含義就是使用$ 替換 ;
舉個(gè)例子 :select * from user$ ##這樣就表示語(yǔ)句的結(jié)束。
delimiter ; ### 使用這個(gè)兩個(gè)語(yǔ)句包裹起來(lái) 這樣里面的;就不會(huì)當(dāng)做結(jié)束符。
MySQL的觸發(fā)器
觸發(fā)器(trigger):監(jiān)視某種情況,并觸發(fā)某種操作
觸發(fā)器創(chuàng)建語(yǔ)法四要素:
1.監(jiān)視地點(diǎn) (table)
2.監(jiān)視事件(insert,delete,update)
3.觸發(fā)時(shí)間(after,before)
4.觸發(fā)事件(insert,delete,update)
MySQL的觸發(fā)器例子。
delimiter $
create trigger update_client_after
after update
on client_grade
for each row
begin
if(old.gradeC!='n') then
update sku set c=12 where shopid=old.shopid;
end if;
end$
delimiter ;
以上就是創(chuàng)建一個(gè)簡(jiǎn)答的觸發(fā)器。update_client_after是觸發(fā)器的名字。after update指的是觸發(fā)時(shí)間,on client_grade指的是對(duì)這張表的監(jiān)聽。for each row是指每操作一行都會(huì)觸發(fā)。begin表示的是觸發(fā)后的操作。使用end結(jié)束。上面的例子包含了一個(gè)if判斷。
關(guān)于觸發(fā)時(shí)間after與before中的old 和new的使用。
after的意思是先完成數(shù)據(jù)的增刪改,然后再觸發(fā),觸發(fā)的語(yǔ)句晚于監(jiān)視的增刪改,無(wú)法影響前面的增刪改動(dòng)作。不能對(duì)new進(jìn)行操作。
before的意思是先觸發(fā)在進(jìn)行數(shù)據(jù)的增刪改。可以根據(jù)觸發(fā)后的結(jié)果完成數(shù)據(jù)操作。(insert、 update)可以對(duì)new操作。
都不能對(duì)old操作。
對(duì)于觸發(fā)器內(nèi)部操作的約束:對(duì)于insert操作,只有對(duì)new 是合法的,對(duì)于delete操作,只有對(duì)old操作是合法的,在update語(yǔ)句中可以同時(shí)操作new和old。這個(gè)很容易理解咯。
MySQL的存儲(chǔ)過(guò)程
delimiter $
create procedure updateds(IN shopid int)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a INT;
DECLARE ids INT;
DECLARE cur CURSOR FOR SELECT id,b FROM sku WHERE shopid=shopid;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur;
REPEAT -- 循環(huán)
FETCH cur INTO ids,a;
IF NOT done THEN
update sku set c=a where id=ids;
END IF;
UNTIL done END REPEAT;-- 結(jié)束循環(huán)
CLOSE cur;-- 這個(gè)語(yǔ)句關(guān)閉先前打開的光標(biāo)。
END$
delimiter ;
存儲(chǔ)過(guò)程的例子。