2017-02-01 9 views
0

私は学校のためのデータベースを作成しています。これは問題です: 属性A、B、C(ここでC =(A /(A + B))* 100)のテーブルがあります。属性AまたはBの更新では、Cを更新する必要があります。 トリガはループを継続しますが、AまたはBを更新するとトリガはCを更新します。 このコードは(sintaxエラー)は動作しません:MariaDBトリガーループ

Create trigger nametrigger 
after update of (A or B) on tablename 

しかし、私は何とかトリガはあなたが記述するものからC.

+0

クライアントにコードを保存するもう1つの理由。 –

答えて

1

AまたはBの更新時に活性化していないために持っていることを指定する必要があります、トリガーは必要ありません。Ccomputed column(別名仮想列)である必要があります。

MariaDB [test]> CREATE TABLE t (
    a INT, 
    b INT, 
    c INT AS ((a/(a+b))*100) PERSISTENT 
); 

MariaDB [test]> insert into t (a,b) values (1,1); 
MariaDB [test]> insert into t (a,b) values (2,2); 

MariaDB [test]> select * from t; 
+------+------+------+ 
| a | b | c | 
+------+------+------+ 
| 1 | 1 | 50 | 
| 2 | 2 | 50 | 
+------+------+------+ 
2 rows in set (0.01 sec) 

MariaDB [test]> update t set b = b*2; 

MariaDB [test]> select * from t; 
+------+------+------+ 
| a | b | c | 
+------+------+------+ 
| 1 | 2 | 33 | 
| 2 | 4 | 33 | 
+------+------+------+ 
2 rows in set (0.00 sec) 

これは単なる例であり、解決策ではありません。どのように正確に構成する必要があるかを判断するには、計算列について読む必要があります。

+0

答えをありがとう。 AとBが別のテーブルの属性であっても同じことができますか? –

+0

いいえ、「Virtual(Computed)Columns」ページの最初の段落から、質問に記載されているリンクを見つけることができます。しかし、答えが具体的に指摘しているように、それはあなたがそれを記述している状況に対処しています。そして、あなたは明示的に、すべての列が同じテーブルに属していると言っていました。 "私は属性A、B、 – elenst