如何在 postgresql 中通过 select 查询插入序列号?

how to insert a serial number through select query in postgresql?

我有一个名为 student 的 table,其下面的列如下所示

S_id, person_id, subject_id, start_date, end_date, count

同时,我编写了一个查询以从其他 table 中提取数据并将其输入 person table

我写的查询如下所示

INSERT INTO student (S_id, person_id, subject_id, start_date, end_date, count)
SELECT
    person_id
    , subject_id,
    , MIN(exam_start_date) AS start_date
    , end_date 
    , COUNT(*) AS count
FROM main_table
GROUP BY person_id, subject_id, end_date 
ORDER BY person_id, subject_id

如您所见,我的 select query 仅从 person_id 和其他列中获取数据。

如何为 select 语句中的 S_id 列创建 autoincrementserial 以便插入数据?

目前,我收到一个错误

ERROR: null value in column "S_id" violates not-null constraint DETAIL: Failing row contains (null, 1234, 77670, 2139-04-22, 2139-04-22, 1).

如果您的 s_id 列尚未定义为 serial 或其他内容(否则只需将其从 INSERT 语句的列列表中保留):

您在寻找 row_number() window function 吗?这会为您的查询创建一个递增的行数,以 1.

开头
SELECT
    row_number() OVER () as s_id, -- <---------------
    person_id
    , subject_id,
    , MIN(exam_start_date) AS start_date
    , end_date 
    , COUNT(*) AS count
FROM main_table
GROUP BY person_id, subject_id, end_date 
ORDER BY person_id, subject_id

也许你应该从你的实际 students table 添加当前最大值 s_id 如果已经有一些记录以避免与可能相同 id 的现有记录发生冲突值。

您的学生 table 应定义为:

create table student (
    s_id int primary key generated always as identity,
    . . .
);

或:

create table student (
    s_id serial primary key ,
    . . .
);

然后您的 INSERT 只是省略了列:

INSERT INTO student (person_id, subject_id, start_date, end_date, count)
    SELECT person_id, subject_id, MIN(exam_start_date) AS start_date,
           end_date, COUNT(*) AS count
    FROM main_table
    GROUP BY person_id, subject_id, end_date 
    ORDER BY person_id, subject_id;

甚至这似乎也值得怀疑,因为一个人可以在 table 中针对不同的主题有多行。甚至根据结束日期重复主题。也许问题在于 student 只是 table 的一个错误名称,它实际上应该被称为其他名称,例如 person_classes.