2016-12-29 5 views
-1

に追加されたときに自動的にテーブルを更新するために、私はテーブルを持っている:どのような値がSQL

vacation_days

id name  work_days  hire 
------------------------------------- 
1 John  369  20151226 
2 Mike  767  20141123 
3 Josh  1166  20131020 

雇う取得するための式があります:

UPDATE vacation_days SET work_days = DATEDIFF(CURDATE(),DATE(hire)) 

をしかし、新しい行を追加すると、ヌル値が得られます。

id name  work_days  hire 
------------------------------------- 
1 John  369  20151226 
2 Mike  767  20141123 
3 Josh  1166  20131020 
4 Richard NULL  20120623 

私はそうのようなトリガを使用しようとしました:私はエラーを取得するしかし

CREATE TRIGGER onInsert BEFORE INSERT ON vacation_days 
FOR EACH ROW 
BEGIN 
SET NEW.work_days = DATEDIFF(CURDATE(),DATE(hire)) 
END; 

You have an error in your SQL syntax; check the manual that corresponds to 
your MySQL server version for the right syntax to use near 
''vacation_days' FOR EACH ROW SET work_days = DATEDIFF(CURDATE(), DATE 
(NEW.hire))' at line 1 

答えて

0

更新しないでください!

create view v_vacation_days 
    select vd.*, DATEDIFF(CURDATE(), DATE(vd.hire)) as workdays 
    from vacation_days vd; 

次に、ビューをクエリするたびに値が最新になります。

注:workdaysをテーブル定義から削除する必要があります。

0

ここでは前に挿入を使用していますが、雇用データは挿入されるまで使用できないため、計算の雇用日は取得できません。使用方法については、NEWまたはOLDの雇用データを示したいとします。

使用あなたの使用のためのトリガーになる前に、この次のINSERT、

DELIMITER // 

CREATE TRIGGER vacation_days_before_insert 
BEFORE INSERT 
    ON vacation_days FOR EACH ROW 
BEGIN 
    -- Insert record into table 
    INSERT INTO vacation_days 
    (id, 
    name, 
    work_days, 
    hire) 
    VALUES 
    (NEW.id, 
    NEW.name, 
    DATEDIFF(CURDATE(),DATE(NEW.hire)), 
    NEW.hire); 

END; // 

DELIMITER ;