2016-12-20 10 views
0

私はSQLを学び始めており、家、部屋、廊下などのテーブルがあるHousesのデータベースを作成しました。NumberOfRoomsという名前の列と、Rooms HouseNameと呼ばれる。SQL - トリガー更新エラー

部屋を家に追加するときにHouse属性 "NumberOfRooms"が増加するようにトリガーを作ろうとしています。

CREATE TRIGGER UpdateNoRooms AFTER INSERT AS 
UPDATE Houses SET Houses.NumberOfRooms = SELECT COUNT(Room) 
             FROM Rooms 
             WHERE Rooms.HouseName = Houses.Name; 

を、それが動作していない:

これは私がしようとしているクエリです。

これは私が取得エラーメッセージです:

ERROR 1064(42000):あなたは、あなたのSQL構文でエラーが発生しています。私はこの問題を解決する方法上の任意のアイデアライン1

で「AS UPDATE Houses SET Houses.NumberOfRooms = SELECT COUNT(Room) FROM Rooms WHERE」の近くに使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルを確認してください?事前にありがとう

答えて

1

ここはクイックバージョンです - あなたは非正規化しました。これは良い考えではありません。その代わりに部屋の数は時間を照会するために残すべきです。

CREATE TRIGGER UpdateNoRooms AFTER INSERT AS 
BEGIN 
    UPDATE Houses h 
     SET h.NumberOfRooms = h.NumberofRooms+1 WHERE :new.HouseName = h.Name; 
END; 
+1

あなたは 'てはいけません:' new.HouseName' – Barmar

+0

'前に、私は疑問を持っている。ここで、 「新しい」の由来ですか?それはSQL用語ですか? – Yash

+0

実際には、クエリ時にこれを行うと、何百万行ものクエリに対してクエリを報告するのに時間がかかりすぎる可能性があるので、これが適切なときには十分です。引き金の中でそれをすることによって、あなたは完全に数を維持します。ただし、レコードを削除できる場合は、削除後トリガーも必要になる場合があります。 – HLGEM

1

MySQL documentationの構文図を参照してください。あなたは、コマンドのいくつかの必要な部分が欠落している:

  1. あなたはトリガーが接続されるべきテーブルにそれを伝えるためにON tablenameを必要としています。

  2. トリガー本体の前にFOR EACH ROWが必要です。

  3. あなたは客室を数える必要はありません。部屋を追加するだけでだから、それがあるべき1

で部屋数を増やしています

CREATR TRIGGER UpdateNoRooms 
AFTER INSERT ON Rooms 
FOR EACH ROW 
    UPDATE Houses AS h 
    SET h.NumberOfRooms = h.NumberOfRooms + 1 
    WHERE h.HouseName = NEW.HouseName