2016-12-28 2 views
0

J'ai donc deux tables, je veux avoir une colonne sur une table incrémentée ou décrémentée lorsque des éléments d'une autre table sont ajoutés ou supprimés, le lien est la clé FOREIGN.SQLite Déclencheur sur une table pour incrémenter et décrémenter la colonne autre table

J'ai deux déclencheurs, mais je ne sais pas s'ils fonctionneraient. J'aimerais donc savoir si j'abois ou non le bon arbre, si je me trompe ou s'il n'y a pas d'amélioration?

SQL =

CREATE TABLE IF NOT EXISTS Agents(
     Id INTEGER PRIMARY KEY, 
     Name TEXT, 
     Office_Count INT, 
    ); 

    CREATE TABLE IF NOT EXISTS Branches(
     Id INTEGER PRIMARY KEY, 
     Street_Address TEXT, 
     City TEXT, 
     Postcode TEXT, 
     Agents_Id INTEGER, 
     FOREIGN KEY(Agents_Id) REFERENCES Branches(Id) 
    ); 

    CREATE TRIGGER Branches_Count_Increment AFTER INSERT ON Branches 
    BEGIN 
     UPDATE Agents SET 
     Office_Count=(MAX(Office_Count)+ 1 FROM Branches Where Agents_Id=Agents.Id) WHERE Id=NEW.Id; 
    END; 

    CREATE TRIGGER Branches_Count_Decrement AFTER DELETE ON Branches 
    BEGIN 
     UPDATE Agents SET 
     Office_Count=(MAX(Office_Count)- 1 FROM Branches Where Agents_Id=Agents.Id) WHERE Id=NEW.Id; 
    END; 
+0

Je recommande de ne pas le faire. Calculer le nombre à la volée si nécessaire –

Répondre

1

Vous aboient dans la direction générale d'un arbre bien.

Mais les WHERE externes utilisent un ID incorrect: la table d'agents doit utiliser un ID d'agent, ce qui n'est pas le cas pour NEW.id. Et le MAX n'est pas nécessaire, et une sous-requête aurait besoin d'un SELECT.

UPDATE Agents 
SET Office_Count = Office_Count + 1 
WHERE Id = NEW.Agents_Id; 
+0

Comment m'assurer que l'agent correct est incrémenté? La branche a un ID_agent qui correspond à un ID d'agent correspondant. Je souhaite uniquement incrémenter ou décrémenter l'agent correspondant à l'ID d'agent correspondant. – Thermatix

+0

Une instruction UPDATE elle-même gère une seule table, donc 'Id' fait référence à' Agents.Id'. –

+0

AH, je vois, merci um qu'en est-il le contraire? décrémentant? Est-ce que le NOUVEAU compte toujours pour ça? – Thermatix