Вставьте максимальное числовое значение в столбец Postgres - PullRequest
0 голосов
/ 25 декабря 2018

Предположим, у меня есть таблица типа

CREATE TABLE public.products
(
    id       INTEGER NOT NULL
    article  CHARACTER VARYING(255)
    name     CHARACTER VARYING(255)
    quantity NUMERIC(10, 3)
)

Как видите, максимальное значение, которое можно вставить в поле quantity, равно 9999999.Если я пытаюсь вставить значение типа 9999999+1, конечно, я получаю

Числовое значение вне диапазона: 7 ОШИБКА: переполнение числового поля

Есть ли способотслеживать на INSERT / UPDATE, что значение quantity превышает 9999999, и вместо этого значения insert / update столбец с 9999999?

Конечно, NUMERIC(10, 3) может бытьNUMERIC(10, 2) или NUMERIC(5, 2) и так далее, поэтому максимальное значение не должно быть жестко задано в тексте запроса.

В псевдокоде это что-то вроде

UPDATE table SET quantity = IF value > 9999999 THEN 9999999 ELSE value;

КонечноЯ могу выполнить некоторые проверки данных перед запуском pgsql-query, но в настоящее время это последнее решение, которое я могу использовать.

1 Ответ

0 голосов
/ 25 декабря 2018

Нет встроенных функций для ограничения числовых значений описанным способом.Вы можете создать и использовать функцию для реализации этого поведения:

create or replace function limited_numeric(val numeric, prec int, scale int)
returns numeric language sql immutable as $$
    select least(mx, val)
    from (
        select format('%s.%s', repeat('9', prec- scale), repeat('9', scale))::numeric as mx
    ) s
$$;

Пример использования:

insert into products 
values (1, 'article 1', 'name 1', limited_numeric(12345678, 10, 3))
returning *;

 id |  article  |  name  |  quantity   
----+-----------+--------+-------------
  1 | article 1 | name 1 | 9999999.999
(1 row)

Нет никаких ограничений для автоматического выполнения этого.Вы также не можете использовать триггер для этого, потому что переполнение числового значения проверяется перед выполнением любого триггера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...