sql >> データベース >  >> RDS >> PostgreSQL

書き込む前に、フィールドの値を別のテーブルの値で制限する

    UPDATEは必要ありません トリガー内。値をNEW.votes_usedに割り当てることができます

    次のようなものを使用します:

    BEGIN
        IF (NEW.votes_used > (SELECT votes_available FROM vote_totals 
         WHERE vote_totals.user_id = NEW.user_id)) THEN
            NEW.votes_used := (SELECT votes_available FROM vote_totals 
             WHERE vote_totals.userID = NEW.user_id);
        END IF;
        RETURN NEW;
    END;
    

    または

    BEGIN
        NEW.votes_used := LEAST(NEW.votes_used, (SELECT votes_available 
                                                 FROM vote_totals 
                                                 WHERE vote_totals.userID = NEW.user_id));
        RETURN NEW;
    END;
    

    これはBEFORE UPDATEである必要があります 動作するトリガー。 (そしてすべてのBEFORE UPDATE トリガーする必要がありますRETURN NEW

    トリガーを使用してチェック制約をエミュレートする場合は、次のようにしてみてください。

    BEGIN
        IF (NEW.votes_used > (SELECT votes_available  
                              FROM vote_totals 
                              WHERE vote_totals.user_id = NEW.user_id)) 
        THEN RAISE EXCEPTION 'Not enough votes';
        END IF;
        RETURN NEW;
    END;
    


    1. 重複する行をmysqlで一意の値に変更するにはどうすればよいですか?

    2. SQL Serverで不明な数の列と集計なしをピボットする方法は?

    3. Postgresqlの列参照IDがあいまいです

    4. max()+1の問題で値を挿入して設定する