PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

limit wartości pola z wartością z innej tabeli przed zapisem

Nie potrzebujesz UPDATE wewnątrz spustu. Możesz przypisać wartość do NEW.votes_used

Użyj czegoś takiego:

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;

Lub

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

To musi być BEFORE UPDATE wyzwalacz do pracy. (I jak wszystkie BEFORE UPDATE wyzwala, musi RETURN NEW ).

Jeśli chcesz emulować ograniczenie sprawdzania za pomocą wyzwalacza - wypróbuj coś takiego:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zaokrąglić wartość milisekund z timestamp(0) w PostgreSQL?

  2. Konwertuj procedurę składowaną SQL Server na procedurę składowaną PostgreSQL

  3. Zarejestruj się i uruchom PostgreSQL 9.0 jako usługę Windows

  4. wybierz/wyświetl ostatnio wstawiony identyfikator seryjny w postgresie

  5. Czy błąd zwrócony przez db.Exec(...) ma kod?