ホームページ > バックエンド開発 > PHPチュートリアル > 2 つのテーブル間にトリガーを作成する方法

2 つのテーブル間にトリガーを作成する方法

WBOY
リリース: 2016-06-13 13:24:39
オリジナル
1042 人が閲覧しました

2 つのテーブル間にトリガーを作成するにはどうすればよいですか?
学生テーブル: 学生番号、名前、年齢、学科番号、学科名
学科テーブル: 学科番号、学科名、名前、年齢。

学生テーブルにレコードを追加する方法。それに応じて学科テーブルも自動的に追加されます。同様に、削除するにはどうすればよいですか?

-----解決策--------------------------------
もちろんです!
このブログ投稿 http://www.cnblogs.com/nicolas_f/archive/2009/09/22/1572050.html を参照してください。

成功したら結果を共有したいと思います。
------解決策----------------------
これまでにやったことがないので、行かせてください 他の人の例を見てください
マニュアルを読みなさいと言われたら、やりすぎではありませんか?
------解決策---------
区切り文字 //
DROP TRIGGER IF EXISTStrigger_on_tab1 //
CREATE TRIGGER TRIGGER_on_tab1
AFTER INSERT ON test1
FOR EACH ROW
BEGIN
insert into test2(test1_id,test1_name) value(new.id, new.name); 🎜 >END//

例、そこから学ぶことができます!

------解決策---------構文が間違っています。 SQL 文字列を投稿して見てください。

------解決策----------------------この記述は正しいです。問題があるはずです。区切り文字。
トリガーを実行する前にセクションを区切ります。変更してから作成します。
delimiter $
存在する場合はトリガーを削除します。 t_afterinsert_on_tab1$
トリガー t_afterinsert_on_tab1 を作成します。
TAB1 に挿入した後

begin
tab2(tab2_name) の値に挿入 (new.tab1_name);
end$
tab1 (tab1_name) の値に挿入 ('Zhang San')$
Thisコード 試して見てください

------解決策------------------

SQL コード

eshop の製品テーブルと注文テーブルを例に挙げます。
新しい製品テーブルを作成する
テーブルグッズを作成(
    id int auto_increment 主キー、#製品 ID
    name varchar(30) not null デフォルト '',#製品名
    num tinyint not null デフォルト 0 #商品の数量
) エンジン myisam デフォルトの文字セット utf8;
新しい注文を作成する
テーブルのインデントを作成(
    oid int auto_increment 主キー、#order id
    gid int null ではないデフォルト 0、#製品 ID
    much tinyint not null デフォルト 0 #購入数量
) エンジン myisam デフォルトの文字セット utf8;
mysql> 説明品;
+------+-------------+------+-----+---------+---- - -----------+
| フィールド タイプ | デフォルト |
+------+-------------+------+-----+---------+---- - -----------+
| int(11) | いいえ |
| 名前 |
| 数値 (4) |
+------+-------------+------+-----+---------+---- - -----------+
3列セット
mysql> 記述インデント;
+------+-----------+------+-----+---------+----- ----------+
| フィールド タイプ | デフォルト |
+------+-----------+------+-----+---------+----- ----------+
| いいえ | int(11) |
| 整数 (11) |
いいえ |
+------+-----------+------+-----+---------+----- ----------+
デモ データを挿入します。
商品の値に挿入します(1,'Samsung 携帯電話',12),(2,'iPad コンピューター',19),(3,'Motorola mp3',38);
mysql> select * from Goods;
+-----+-------------+-----+
| 名前 |
+-----+-------------+-----+
| サムスンの携帯電話 12 |
| iPad コンピューター |
| モトローラmp3 |
+-----+-------------+-----+
購入レコードを注文テーブルに手動で追加します。
indent(gid,much)values(3,2) に挿入します。
mysql> インデントから * を選択します。
+-----+-----+-----+
| イド |
+-----+-----+-----+
| 1 | 3 |
+-----+-----+-----+
セット内の 1 行
製品情報を製品テーブルに手動で削減します。
商品セット num=num-2 (id=3) を更新します。
mysql> select * from Goods;
+-----+-------------+-----+
| 名前 |
+-----+-------------+-----+
| サムスンの携帯電話 12 |
| iPad コンピューター |
| モトローラmp3 |
+-----+-------------+-----+
3列セット
mysql の終了文字を変更します。
mysql> 区切り文字 $
--------------------------------------------------
トリガーの作成
トリガー tg1 を作​​成する
挿入後 #挿入後のトリガー
インデント上
行ごとに#書き込み方法を修正
始める
商品セット num=num-1 (id=3) を更新します。
終わり
$
------------------------------------------
ユーザーの注文プロセスをシミュレートする
製品リスト:
+-----+-------------+-----+
| 名前 |
+-----+-------------+-----+
| サムスンの携帯電話 12 |
| iPad コンピューター |
| モトローラmp3 |
+-----+-------------+-----+
注文フォーム:
+-----+-----+-----+
| イド |
+-----+-----+-----+
| 1 | 3 |
+-----+-----+-----+
①注文する
indent(gid,much)values(2,4)$ に挿入
②オーダーフォームを見る
+-----+-----+-----+
| イド |
+-----+-----+-----+
| 1 | 3 |
| 2 | 2 |
+-----+-----+-----+
③商品リストを減らすべき
+-----+-------------+-----+
| 名前 |
+-----+-------------+-----+
| サムスンの携帯電話 12 |
| iPad コンピューター |
| モトローラmp3 |
+-----+-------------+-----+
結論: 明らかに、ユーザーは注文番号 2 を出し、4 つの商品を発注し、注文が生成されました。商品数が減らない、エラーが出る!--------------------------------------
トリガーを正しく作成します。
トリガー tg2 を作成する
挿入後
インデント上
各行ごとに
始める
商品セット num=num-new.much を更新します (id=new.gid;)。
終わり
$
----------------------------------発注挿入トリガー---------- -- --------------------------------

エラーが発生しました: テーブルを 2 つのトリガーで同時に監視できないため、最初に作成したトリガーを削除する必要があります。
mysql>tg1$ をドロップします
クエリは OK、影響を受ける行は 0 件です

mysql> トリガーを表示$
空の集合
商品の購入を開始します (注文フォームをクリアします):
mysql> select * from Goods;
    ->$
+-----+-------------+-----+
| 名前 |
+-----+-------------+-----+
| サムスンの携帯電話 12 |
| iPad コンピューター |
| モトローラmp3 |
+-----+-------------+-----+
3列セット

mysql> indent(gid,much)values(2,4)$ に挿入
クエリは OK、1 行が影響を受けました

mysql> select * from indent$ #注文は正常に完了しました
+-----+-----+-----+
| イド |
+-----+-----+-----+
| 1 | 2 |
+-----+-----+-----+
セット内の 1 行

mysql> select * from Goods$ #該当する商品が自動的に減額されます OK
+-----+-------------+-----+
| 名前 |
+-----+-------------+-----+
| サムスンの携帯電話 12 |
| iPad コンピューター |
| モトローラmp3 |
+-----+-------------+-----+
3列セット
------------------------------------------------注文をキャンセルするトリガーの削除--- ----------------------------------
トリガー tg3 を作成する
削除後
インデント上
各行ごとに
始める
商品セット num=num+old.much を更新します (id=old.gid;)。
終わり
$
注: 実際のプロジェクトでは、オーダーが物理的に削除されることはありません。
----------------------------------
注文のキャンセルをシミュレートします。
mysql> select * from Goods$
+-----+-------------+-----+
| 名前 |
+-----+-------------+-----+
| サムスンの携帯電話 12 |
| iPad コンピューター |
| モトローラmp3 |
+-----+-------------+-----+
3列セット

mysql>select * from indent$
+-----+-----+-----+
| イド |
+-----+-----+-----+
| 1 | 2 |
+-----+-----+-----+
セット内の 1 行

mysql> oid=1$ のインデントから削除
クエリは OK、1 行が影響を受けました

mysql>select * from indent$
空の集合

mysql> select * from Goods$
+-----+-------------+-----+
| 名前 |
+-----+-------------+-----+
| サムスンの携帯電話 12 |
| iPad コンピューター |
| モトローラmp3 |
+-----+-------------+-----+
3列セット
------------------------------------注文更新トリガーの変更--------- - -----------------------------
注文式を変更します。商品セット num=num+old.much-new.much を更新します (id=old.gid;)。
重要な部分: 新しい数量など = 独自の数量 + 変更された古い数量 - 新しく生成された数量 (完全な数学的論理)、ID は変更されません。
トリガー tg4 を作成する
アップデート後
インデント上
各行ごとに
始める
商品セット num=num+old.much-new.much を更新します (id=old.gid;)。
終わり
$
------------------------
mysql> select * from Goods$
+-----+-------------+-----+
| 名前 |
+-----+-------------+-----+
| サムスンの携帯電話 7 |
| iPad コンピューター |
| モトローラmp3 |
+-----+-------------+-----+
3列セット

mysql> インデントから * を選択
$
+-----+-----+-----+
| イド |
+-----+-----+-----+
| 2 | 1 |
+-----+-----+-----+
セット内の 1 行
mysql> インデントセット much=10 where oid=2$
クエリは OK、1 行が影響を受けました
一致した行: 1 変更された: 1 警告: 0

mysql> select * from Goods$
+-----+-------------+-----+
| 名前 |
+-----+-------------+-----+
| サムスンの携帯電話 2 |
| iPad コンピューター |
| モトローラmp3 |
+-----+-------------+-----+
3列セット

mysql>select * from indent$
+-----+-----+-----+
| イド |
+-----+-----+-----+
| 2 | 10 |
+-----+-----+-----+
セット内の 1 行
--------------------------------------------------
トリガーの基礎は完成しました!

テーブルをすばやくクリアします: truncate [テーブル名]
mysql の終了文字を変更します: 区切り文字 $;
トリガーの表示:トリガーの表示
トリガーの削除: トリガーを削除 [トリガー名]
トリガーを作成します。
トリガーを作成 [トリガー名]
[トリガー動作/挿入/更新/削除]後
[監視対象/あるテーブル]について
行ごとに#書き込み方法を修正
始める
    SQL ステートメント;
終わり
$
注: トリガーは、特定のテーブルの特定の動作にのみ対応できます。複数のトリガーでテーブルの同じ動作を監視することはできません。
 <div class="clear"></div>
ログイン後にコピー
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート