sql >> Database >  >> RDS >> PostgreSQL

PG::Error - numeriek veld overloop op Heroku

Je hebt een numeric veld met typmod numeric(8,2) en u probeert een waarde op te slaan die groter is dan 999999.99 in het. Zie de PostgreSQL-handleiding op NUMERIC voor informatie over numerieke schaal en precisie, de kwalificaties die worden weergegeven na het type tussen haakjes.

Deze eerdere vraag lijkt hetzelfde probleem met Rails te dekken, met het Rails-model en hoe de schaal en precisie worden toegewezen.

NUMERIC is geen datum/tijd-veld, het is een numeriek veld.

Demo van het probleem:

regress=> SELECT  NUMERIC(8,2) '999999.99';
  numeric  
-----------
 999999.99
(1 row)

regress=> SELECT  NUMERIC(8,2) '1000000.00';
ERROR:  numeric field overflow
DETAIL:  A field with precision 8, scale 2 must round to an absolute value less than 10^6.

Het is jammer dat Pg je niet vertelt welk veld dit is als het een veld is. Het is echter moeilijk om dit te doen, omdat het meestal niet weet welke waarde in welk veld zal gaan wanneer het tekenreeksliteralen ontleedt. Schakel log_statement = 'all' in in postgresql.conf , ALTER USER ... SET , ALTER DATABASE ... SET , of per sessie met SET log_statement = 'all' test en onderzoek vervolgens de querylogboeken opnieuw.

Bekijk ook de tabeldefinities met \dt in psql om te zien wat het type numeric(8,2) . kan hebben en kan het probleem veroorzaken.

Wat betreft waarom het lokaal werkt:is de lokale DB PostgreSQL? Sommige Rails-gebruikers lijken een heel vreemde opstelling te hebben waarbij ze SQLite lokaal en PostgreSQL op Heroku gebruiken. Dit is een recept voor chaos en implementatieproblemen. Gebruik dezelfde database bij het ontwikkelen en testen. Als het is PostgreSQL lokaal, is het dezelfde versie?




  1. MySQL 8 - Verwijder alle opgeslagen procedures in een specifieke database

  2. GROUP BY en ORDER BY

  3. Hoe date_trunc() werkt in PostgreSQL

  4. De onderliggende kolommen van een weergave verkrijgen op basis van de resultatenset