2017-10-25 19 views
0

私はMySQLが初めてのので、正しい構文がこれらの質問に答えるのは混乱しています。次のようにスキーマは次のとおりです。基本的なSQLトリガー

  1. Product (maker, model, type) 
    PC (model, speed, ram, hdisk, price) 
    Laptop (model, speed, ram, hdisk, screen, price) 
    Printer (model, color, type, price) 
    
    任意のPCのRAMやハードディスクを更新し、更新されたPCは、RAM、少なくとも100倍のハードディスクを持っていることを確認してください。新しいPC、ノートパソコン、またはプリンターを挿入する場合

  2. 、モデル番号は以前、PCのいずれかに表示されLaptop、またはPrinterなかったことを確認してください。

+0

これまでに試した質問を追加してください。 –

答えて

0

あなたの質問の説明から、私はあなたがSQL/MySqlを初めて使用していると仮定しています。

あなたはここで正しいところですが。前述のタスクを達成するには、SQLトリガーが必要です。

注:あなた自身でタスクを試してください。あなたがどこかについていたら、 に行ってください。

タスク1:明らかに、テーブルPCにはUpdate triggerが必要です。トリガは、更新ごとにPCで実行されます。トリガは関係なく試みが続いて成功したか否かの、 行を挿入または変更しようとすることによって活性化される前に

A:

しかし、以下は、MySQLマニュアル(link)からステートメントです。

したがって、トリガーを作成してエラーメッセージを表示しても、更新はまだPCで行われます。

更新プロセスを防止するため、Trigger内でSQLStateを使用します。

MySqlの失敗ごとに一意のSQLStateまたはSignalがあり、PCの更新を防ぐために、適切なSQLStateを設定します。

トリガー:

CREATE TRIGGER BF_UPD_PC 
    BEFORE UPDATE ON PC FOR EACH ROW 
    BEGIN 
      IF NEW.hdisk >= 100*(NEW.ram) 
      THEN 
       SIGNAL SQLSTATE '45000' 
        SET MESSAGE_TEXT = 'Cannot add or update row: HardDisk should be at least 100 times more than RAM.'; 
      END IF; 
    END; 

タスク2:

ここで、我々は新しいモデルナンバーがすでに何らかのPCに割り当てられていないことを確認することができBefore Insertトリガーを作成する必要があり、PrinterまたはLaptopとしてください。

トリガー:

CREATE TRIGGER BF_INS_PRODUCT 
    BEFORE INSERT ON PRODUCT 
    BEGIN 
      IF NEW.model in (select distinct model from pc 
          union all 
          select distinct model from printer 
          union all 
          select distinct model from laptop) 
      THEN 
       SIGNAL SQLSTATE '45000' 
        SET MESSAGE_TEXT = 'Cannot add or update row: Model number already assigned. Please try with another model number'; 
      END IF; 
    END; 

を完了!

希望すると助かります!

+0

正常に動作していますか? –