Вставьте значение bigint в тип столбца int Postgresql - PullRequest
0 голосов
/ 26 февраля 2020

Мне нужно вставить некоторые данные из одной таблицы в другую в Postgresql. Схема таблицы, которую мне нужно заполнить данными, выглядит следующим образом:

create table public.test_int_table(
    id                          int,
    description             text,
    hash_code               int
);

Проблема в том, что столбец id в другой таблице имеет тип bigint. Поэтому, когда я пытаюсь вставить битовые данные в столбец int, я получаю исключение:

insert into public.test_int_table
select * from public.test_table

SQL Error [22003]: ERROR: integer out of range

Как я могу обрезать данные bigint для вставки в Postgresql? Обычный оператор приведения, похоже, работает только для апскейтинга (от int до bigint и никак иначе) Если бы оно не было постоянно увеличивающимся значением, оно в большинстве случаев вписывается в int, так что я не очень хочу терять здесь точность.

1 Ответ

1 голос
/ 26 февраля 2020

Это может быть довольно опасно, потому что вы можете получить дубликаты. Но вы можете использовать прямое сравнение, а затем обрабатывать слишком большие значения. Следующие «обрезает» их до NULL:

insert into public.test_int_table (id, description, hash_code)
    select (case when id < 2^31 - 1 then id::int end) as id,
           description, hash_code
    from public.test_table;

Обратите внимание, что это может полностью испортить данные. Если вы можете изменить значение, вы можете заменить его новым значением:

insert into public.test_int_table (id, description, hash_code)
    select dense_rank() over (order by id),
           description, hash_code
    from public.test_table;
...