如何在 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
列创建 autoincrement
或 serial
以便插入数据?
目前,我收到一个错误
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
.
我有一个名为 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
列创建 autoincrement
或 serial
以便插入数据?
目前,我收到一个错误
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
.