2016-12-20 2 views
0

Je commence à apprendre le SQL et j'ai créé une base de données de Maisons où j'ai une table pour Maisons, Chambres, Couloirs, etc. J'ai une colonne dans les Maisons appelée NumberOfRooms, et une colonne dans les Chambres appelé HouseName.SQL - Erreur de mise à jour du déclencheur

J'essaye de faire un déclencheur de sorte que quand une pièce est ajoutée à une maison, l'attribut House "NumberOfRooms" est incrémenté.

C'est la requête que je suis en train:

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

, mais il ne fonctionne pas.

Tel est le message d'erreur que je reçois:

erreur 1064 (42000): Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près « AS UPDATE Houses SET Houses.NumberOfRooms = SELECT COUNT(Room) FROM Rooms WHERE » à la ligne 1

Toutes les idées sur comment je peux résoudre ce problème? Merci d'avance

Répondre

1

Voici une version rapide - vous avez dénormalisé - ce qui n'est pas une bonne idée. à la place, le nombre de pièces devrait être laissé à l'heure de la requête.

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

Vous ne devriez pas avoir ':' 'avant new.HouseName' – Barmar

+0

J'ai une question, où est-ce que le "nouveau" vient? Est-ce un terme SQL? – Yash

+0

En fait, il y a beaucoup de fois où c'est la bonne chose à faire parce que faire cela au moment de la requête peut prendre trop de temps pour rapporter des requêtes sur des millions de lignes. En le faisant dans un déclencheur vous maintenez le nombre parfaitement. Cependant, si des enregistrements peuvent être supprimés, vous pouvez également avoir besoin d'un déclencheur après suppression. – HLGEM

1

Voir le diagramme de syntaxe dans le MySQL documentation. Vous manque plusieurs pièces nécessaires de la commande:

  1. Vous devez ON tablename pour lui dire quelle table la gâchette doit être attaché. Vous avez besoin de FOR EACH ROW avant le corps de déclencheur.

  2. Vous n'avez pas besoin de compter les chambres. Ajout d'une chambre augmente simplement la salle compte par 1.

Il doit donc être:

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