0
votes

SQL: J'ai besoin d'une colonne pour mettre à jour sa valeur automatiquement en fonction des valeurs des autres colonnes.

Supposons que nous ayons deux tables:

  • Employés (ID (PK), Salaire)
  • bonus (ID (FK), augmentation, totale)

    bonus.id est un FK qui fait référence à la PK "Employés.Id".

    Je veux Total pour être égal à Employés.Salary + bonus.Increase Par défaut. Je souhaite également que la valeur soit attribuée au total, chaque fois qu'un salaire ou un bonus est mis à jour.

    Quelles déclarations SQL ou PL / SQL sont capables de le faire?

    note: je suis un noob absolu.


10 commentaires

Utilisez la gâchette pour obtenir la même chose.


Envisagez de ne pas stocker des données dérivées du tout. Obtenez-les avec une vue.


Créer après la mise à jour Trigger Stackoverflow .Com / Questions / 48385268 / ...


Vous pouvez utiliser les déclencheurs pour y parvenir, mais ce serait un très mauvais choix. En fait, vous n'avez probablement pas besoin de la colonne totale du tout. Vous pouvez avoir cette colonne dans une vue comme mentionné par @Thumbquat.


@Tejash ---- Ora-00980 Je cherche des déclencheurs en ce moment. Je pense qu'ils vont faire l'affaire. Je n'ai juste jamais entendu parler d'eux auparavant. Merci!


@Serg je ne peux pas utiliser de vue. Je travaille juste sur une mission.


Merci! Je pense que je dois utiliser un déclencheur. Je sais que ce n'est pas un bon choix et que les tables n'ont pas vraiment de sens, mais je ne fais que cela à des fins éducatives


Ce n'est pas une réponse. Ce devrait être un commentaire - En effet, vous êtes d'accord avec les commentaires postés - mais évidemment, vous n'avez pas encore suffisamment de points de réputation pour publier des commentaires. Hélas, poster des non-réponses comme celui-ci ne devrait pas être le moyen de gagner des points


Vous devriez développer cela afin que cela devienne une réponse. Comment le résoudriez-vous avec une gâchette (fourniriez-vous un exemple de travail basé sur les tables de l'OP)? Développez pourquoi c'est une mauvaise idée. Donnez un exemple de la meilleure solution qu'un déclencheur serait mis en œuvre.


Dans une structure d'entreprise normale, chaque employé a un salaire. Toutefois, des bonus sont attribués sur une base ad hoc, sans employé garantissant un bonus et le bonus attribué peut être différent chaque année. Est-ce votre modèle? Quand un employé est créé, ils ont un bonus? Un nouveau bonus signifie-t-il un nouveau disque ou une mise à jour de l'enregistrement existant?


3 Réponses :


0
votes

Vous pouvez le faire facilement avec une vue: xxx

Cela resterait à jour automatiquement. Cependant, si l'employé à bonus n'est pas toujours une relation de 1 à 1, vous obtiendrez des lignes en double pour chaque rang de bonus supplémentaire.


2 commentaires

Merci! Mais cela ne met pas à jour la table de bonus. J'en ai besoin pour être mis à jour.


Vous pouvez créer une gâchette lorsque vous insérez et mettez à jour pour obtenir ces valeurs et mettre à jour votre colonne totale.



2
votes

S'il y a toujours une correspondance individuelle entre les lignes de la table code> de la table code> et de la table CODE> Employés CODE>, la meilleure solution consisterait à repousser ce Les exigences sont incorrectes et la table code> code> doit être réalisée dans la table code> Employee CODE> et la colonne code> totale code> pourrait être un virtuel code> Colonne: xxx pré>

puis: p> xxx pré>

sorties: p>

ID | SALARY | BONUS | TOTAL
-: | -----: | ----: | ----:
 1 |    100 |    10 |   110
 2 |    100 |  null |   100


1 commentaires

Votre réponse a été très utile! Mais je ne peux pas changer les structures. Donc, j'ai utilisé des déclencheurs à la place. J'apprécie fortement vos efforts! Merci!



1
votes

La réponse précédente de @ mt0 est parfaite.

Mais si vous ne pouvez pas modifier la structure de la table et besoin de solution de déclenchement, vous avez besoin des deux déclencheurs suivants. P>

CREATE OR REPLACE TRIGGER TRG_EMPLOYEES AFTER
    UPDATE OF SALARY ON EMPLOYEES
    FOR EACH ROW
BEGIN
    UPDATE BONUS
    SET
        TOTAL = :NEW.SALARY + INCREASE
    WHERE
        ID = :NEW.ID;

END;
/


CREATE OR REPLACE TRIGGER TRG_BONUS BEFORE
    INSERT OR UPDATE OF INCREASE ON BONUS
    FOR EACH ROW
DECLARE
    LV_TOTAL   BONUS.TOTAL%TYPE;
BEGIN
    SELECT
        SALARY + NVL(:NEW.INCREASE, 0)
    INTO LV_TOTAL
    FROM
        EMPLOYEES
    WHERE
        ID = :NEW.ID;

    :NEW.TOTAL := LV_TOTAL;
END;
/


0 commentaires