Генерация уникального идентификатора для добавления записей в PostgreSQL - PullRequest
0 голосов
/ 25 января 2019

Я использую один запрос postgreSql, который заполняет одну таблицу несколькими значениями, и он принимает другой параметр при запуске. Я добавляю строки каждый раз, когда запускаю запрос с другим параметром. Теперь я заинтересован в предоставлении одного автоматически сгенерированного идентификатора для всех строк, которые поступают в качестве выходных данных для одного набора параметров. Так что я могу получить доступ к тем строкам, которые принадлежат определенные параметры.

Может кто-нибудь помочь мне, как добавлять строки каждый раз с одним столбцом уникального идентификатора?

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Вы можете использовать serial (или bigserial для bigint) в качестве типов столбцов.

Они на самом деле являются оболочками для целочисленных и больших целочисленных типов, которые автоматически настраивают значение по умолчанию для nextval() специальной последовательности который он также создает для вас под капотом.

Чтобы добавить такое поле, вам нужно выполнить только следующее предложение:

alter table your_table add column id serial primary key;

(Настройка имен таблиц и столбцов в соответствии с вашими потребностями / потребностями).

Очевидно, что если вы еще не создали таблицу, вы можете просто добавить поле, указав его как serial в объявлении таблицы. Но не забудьте также объявить его как primary key, чтобы обеспечить его обработку как таковую.

Это создаст и заполнит (из-за присущего ему значения по умолчанию) столбец id последовательными числами в одной транзакции.

Имейте в виду, что в зависимости от размера таблицы это может занять значительное время.

Кроме того, для больших таблиц вам может потребоваться использовать bigserial вместо serial .

Чтобы получить id , назначенный только что вставленной строке, вы можете добавить к оператору вставки предложение returning id, которое будет действовать как выборка, возвращающая строку (или несколько строк, если вставив несколько с одним утверждением) с ним (конечно, вы также можете использовать returning * или returning _whatever_columns_you_want_.

0 голосов
/ 25 января 2019

Похоже, вы хотите отслеживать "runid", который основан на параметре. Это будет отдельный объект. Я хотел бы предложить такую ​​структуру данных:

create table runs (
    runid serial primary key,
    parameter varchar(255),
    createdAt timestamp default current_timestamp
);

Тогда вы включите в свою таблицу runid со ссылкой на внешний ключ runs.

Наконец, вы можете вставить в таблицу, выполнив:

with r as (
      insert into runs (v_parameter)
          values (parameter)
          returning *
     )
insert into yourtable ( . . . , runid)
    select . . ., r.runid
    from . . . cross join
         r;
0 голосов
/ 25 января 2019

Вы можете использовать оператор RETURNING для получения возвращаемого идентификатора

INSERT INTO Table1 (...) VALUES (...)
RETURNING idCol;

синтаксис

RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...