bitsCN.com
如果公司里有上百個(gè)表要做觸發(fā)器,如果手動(dòng)寫代碼的話。很累,所以今天寫了一個(gè)小程序,自動(dòng)生成mysql的觸發(fā)代碼。
$dbname = test;//數(shù)據(jù)庫
$tab1 = user; //執(zhí)行的表
$tab2 = user_bak; //被觸發(fā)的表
$conn = mysql_connect("localhost","root", "root",$dbname) or die("請檢查你的主機(jī)名數(shù)據(jù)庫用戶名和密碼");
mysql_select_db($dbname, $conn) or die("數(shù)據(jù)庫還沒有連接");
$query = mysql_query("SHOW COLUMNS FROM $tab1");mysql_query("");
while($row=mysql_fetch_array($query,MYSQL_NUM)){//得到表的字段數(shù)組
$temp[] = $row[0];
$str1 .= `.$row[0].`,;
$str2 .= new..$row[0].,;
$str3 .= $row[0].=new..$row[0].,;
}
//insert觸發(fā)器
$inser_str = "
{$tab1}表的insert觸發(fā)器
";
$inser_str .= "create trigger ".$tab1."_insert
AFTER INSERT
on ".$tab1."
";
$inser_str .="for each row
INSERT INTO {$tab2} (".rtrim($str1,,).) VALUES (.rtrim($str2,,).);;
//update觸發(fā)器
$update_str = "
{$tab1}表的update觸發(fā)器
";
$update_str .= "create trigger ".$tab1."_update
";
$update_str .= "after update
";
$update_str .= "on ".$tab1.
;
$update_str .= "for each row
";
$update_str .= "update ".$tab2." set ".rtrim($str3,,)." where id = new.id;//這里的where id = new.id要手動(dòng)改一下。改成主鍵的字段名";
//delete觸發(fā)器
$delete_str = "
{$tab1}表的delete觸發(fā)器
";
$delete_str .= "create trigger ".$tab1."_delete
";
$delete_str .= "after delete
";
$delete_str .= "on ".$tab1."
";
$delete_str .= "for each row
";
$delete_str .= "delete from ".$tab2." where id=OLD.id//這里的where id = new.id要手動(dòng)改一下。改成主鍵的字段名
";
echo $inser_str;
echo $update_str;
echo $delete_str;
echo
注意:
1.觸發(fā)器可用于InnoDB或MyISAM類型的表
2.插入的時(shí)候用AFTER INSERT 更好的保證數(shù)據(jù)ID的對應(yīng),如果用before INSERT有可能造成ID不對應(yīng)
3.如new.id則是表示主表中的字段
4.sql語句太多,用 begin..end
5.使用show triggers語句查看數(shù)據(jù)庫中的觸發(fā)器。
6.刪除觸發(fā)器DROP TRIGGER IF EXISTS `test`
7.作者:華夏之星;
echo <<
語法:
create trigger <觸發(fā)器名稱>
{ before | after}
{insert | update | delete}
on <表名>
for each row
<觸發(fā)器SQL語句>
參數(shù)詳解如下:
create trigger <觸發(fā)器名稱>:創(chuàng)建一個(gè)新觸發(fā)器,并指定觸發(fā)器的名稱。
{ before | after}:用于指定在insert、update或delete語句執(zhí)行前觸發(fā)還是在語句執(zhí)行后觸發(fā)。
on <表名>:用于指定響應(yīng)該觸發(fā)器的表名。
for each row:觸發(fā)器的執(zhí)行間隔,for each row 通知觸發(fā)器每隔一行執(zhí)行一次動(dòng)作,而不是對整個(gè)表執(zhí)行一次。
<觸發(fā)器SQL語句>:觸發(fā)器要執(zhí)行的SQL語句,如果該觸發(fā)器要執(zhí)行多條SQL語句,要將多條語句放在begin…end塊中。
如:begin…end塊(它不能上phpadmin上運(yùn)行。因?yàn)閜hpmyadmin沒有對begin...end解析。)
mysql_query("
create trigger user_delete
after delete
on user
for each row BEGIN
delete from user_bak where id=OLD.id;
delete from aaa where id=OLD.id;
END;");
EOT;
?>
PHP與MYSQL的觸發(fā)器
bitsCN.com
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com