Sql 如何在基于select-Postgres的插入过程中继续序列号
我正在使用PostgreSQL数据库。我有两张表,如下所示Sql 如何在基于select-Postgres的插入过程中继续序列号,sql,postgresql,select,insert,where-clause,Sql,Postgresql,Select,Insert,Where Clause,我正在使用PostgreSQL数据库。我有两张表,如下所示 CREATE TABLE Table_2( SNO INTEGER (20) UNIQUE NOT NULL, PERSON_ID INTERGER (20) NOT NULL, date_1 DATE NOT NULL, date_2 DATE NOT NULL, DEPT VARCHAR (10) NOT NULL ); `ERROR: null value in column "SNO" viola
CREATE TABLE Table_2(
SNO INTEGER (20) UNIQUE NOT NULL,
PERSON_ID INTERGER (20) NOT NULL,
date_1 DATE NOT NULL,
date_2 DATE NOT NULL,
DEPT VARCHAR (10) NOT NULL
);
`ERROR: null value in column "SNO" violates not-null constraint
DETAIL: Failing row contains (null, 2, 1900-01-01, 2900-12-30, F).
SQL state: 23502`
我想通过引用表1中的记录,在表2中添加失踪人员的ID
如果您看到上面的表,您会注意到表2中缺少表1中的person_id=2,4
虽然我可以在论坛的帮助下完成这项工作,问题在于NOTNULL约束。
表2创建表定义如下所示
CREATE TABLE Table_2(
SNO INTEGER (20) UNIQUE NOT NULL,
PERSON_ID INTERGER (20) NOT NULL,
date_1 DATE NOT NULL,
date_2 DATE NOT NULL,
DEPT VARCHAR (10) NOT NULL
);
`ERROR: null value in column "SNO" violates not-null constraint
DETAIL: Failing row contains (null, 2, 1900-01-01, 2900-12-30, F).
SQL state: 23502`
这就是我试过的
INSERT into Table_2 (person_id,date_1,date_2,Dept) (select distinct person_id,TO_DATE('1900-01-01', 'YYYY-MM-DD'),TO_DATE('2900-12-30', 'YYYY-MM-DD'),'F' from Table_1 where person_id not in (select distinct person_id from Table_2))
这将导致如下所示的错误
CREATE TABLE Table_2(
SNO INTEGER (20) UNIQUE NOT NULL,
PERSON_ID INTERGER (20) NOT NULL,
date_1 DATE NOT NULL,
date_2 DATE NOT NULL,
DEPT VARCHAR (10) NOT NULL
);
`ERROR: null value in column "SNO" violates not-null constraint
DETAIL: Failing row contains (null, 2, 1900-01-01, 2900-12-30, F).
SQL state: 23502`
我希望我的输出如下所示。请注意,我的真实数据有超过50K条记录,新添加的记录应按原样继续序列
如果
表2中的sno
具有序列或是串行列,请尝试此操作
样本数据
CREATE TABLE table_1 (person_id int, day_of_birth int, month_of_birth int, gender text);
INSERT INTO table_1
VALUES (4,17,7,'M'),
(2,15,3,'F');
CREATE TABLE table_2 (sno serial, person_id int, date_1 date, date_2 date, dept text);
INSERT INTO table_2 (person_id, date_1, date_2, dept)
VALUES (1,'1990-02-27','2020-03-13','A'),
(3,'1990-02-28','2020-02-14','B');
插入查询
INSERT into Table_2 (person_id,date_1,date_2,dept)
SELECT person_id,
TO_DATE('1900-01-01', 'YYYY-MM-DD'),
TO_DATE('2900-12-30', 'YYYY-MM-DD'),'F'
FROM Table_1 WHERE person_id NOT IN (SELECT person_id FROM Table_2);
结果
SELECT * FROM table_2;
sno | person_id | date_1 | date_2 | dept
-----+-----------+------------+------------+------
1 | 1 | 1990-02-27 | 2020-03-13 | A
2 | 3 | 1990-02-28 | 2020-02-14 | B
3 | 4 | 1900-01-01 | 2900-12-30 | F
4 | 2 | 1900-01-01 | 2900-12-30 | F
(4 Zeilen)
编辑(见评论)
创建一个
然后使用nextval
INSERT INTO Table_2 (sno, person_id,date_1,date_2,dept)
SELECT nextval('seq_sno'),person_id,
TO_DATE('1900-01-01', 'YYYY-MM-DD'),
TO_DATE('2900-12-30', 'YYYY-MM-DD'),'F'
FROM Table_1 WHERE person_id NOT IN (SELECT person_id FROM Table_2);
SELECT * FROM table_2;
sno | person_id | date_1 | date_2 | dept
-----+-----------+------------+------------+------
1 | 1 | 1990-02-27 | 2020-03-13 | A
2 | 3 | 1990-02-28 | 2020-02-14 | B
3 | 4 | 1900-01-01 | 2900-12-30 | F
4 | 2 | 1900-01-01 | 2900-12-30 | F
(4 Zeilen)
如果表2
中的sno
具有序列或序列列,请尝试此操作
样本数据
CREATE TABLE table_1 (person_id int, day_of_birth int, month_of_birth int, gender text);
INSERT INTO table_1
VALUES (4,17,7,'M'),
(2,15,3,'F');
CREATE TABLE table_2 (sno serial, person_id int, date_1 date, date_2 date, dept text);
INSERT INTO table_2 (person_id, date_1, date_2, dept)
VALUES (1,'1990-02-27','2020-03-13','A'),
(3,'1990-02-28','2020-02-14','B');
插入查询
INSERT into Table_2 (person_id,date_1,date_2,dept)
SELECT person_id,
TO_DATE('1900-01-01', 'YYYY-MM-DD'),
TO_DATE('2900-12-30', 'YYYY-MM-DD'),'F'
FROM Table_1 WHERE person_id NOT IN (SELECT person_id FROM Table_2);
结果
SELECT * FROM table_2;
sno | person_id | date_1 | date_2 | dept
-----+-----------+------------+------------+------
1 | 1 | 1990-02-27 | 2020-03-13 | A
2 | 3 | 1990-02-28 | 2020-02-14 | B
3 | 4 | 1900-01-01 | 2900-12-30 | F
4 | 2 | 1900-01-01 | 2900-12-30 | F
(4 Zeilen)
编辑(见评论)
创建一个
然后使用nextval
INSERT INTO Table_2 (sno, person_id,date_1,date_2,dept)
SELECT nextval('seq_sno'),person_id,
TO_DATE('1900-01-01', 'YYYY-MM-DD'),
TO_DATE('2900-12-30', 'YYYY-MM-DD'),'F'
FROM Table_1 WHERE person_id NOT IN (SELECT person_id FROM Table_2);
SELECT * FROM table_2;
sno | person_id | date_1 | date_2 | dept
-----+-----------+------------+------------+------
1 | 1 | 1990-02-27 | 2020-03-13 | A
2 | 3 | 1990-02-28 | 2020-02-14 | B
3 | 4 | 1900-01-01 | 2900-12-30 | F
4 | 2 | 1900-01-01 | 2900-12-30 | F
(4 Zeilen)
在大多数情况下,如果表具有整数主键,则使用以下方式分配:
serial
始终作为标识生成
- 序列号,可能使用触发器自动设置
- 指由业务部门定义的内容
你的桌子好像没找到那个。我建议您修理桌子,但如果您不能,您可以尝试:
insert into Table_2 (sno, person_id, date_1, date_2, Dept)
select t2.max_sno + row_number() over (order by t1.person_id),
t1.person_id, date '1900-01-01', date '2900-12-30', 'F'
from Table_1 t1 cross join
(select max(t2.sno) as max_sno from table_2 t2) t2
where not exists (select 1
from table_2 t2
where t2.person_id = t1.person_id
);
我并不真的推荐这种方法,除了作为一种变通方法。正确的方法是修复表
注:
- 使用简单的日期常量。这使用了
date
关键字,但您也可以使用'2020-01-01'::date
notexists
比notin
更可取,因为它处理NULL
值
- 整个
WHERE
子句不是防止重复的最佳方法。更好的方法是在冲突中使用(或者两者同时使用)
在表具有整数主键的大多数情况下,使用以下方法分配:
serial
始终作为标识生成
- 序列号,可能使用触发器自动设置
- 指由业务部门定义的内容
你的桌子好像没找到那个。我建议您修理桌子,但如果您不能,您可以尝试:
insert into Table_2 (sno, person_id, date_1, date_2, Dept)
select t2.max_sno + row_number() over (order by t1.person_id),
t1.person_id, date '1900-01-01', date '2900-12-30', 'F'
from Table_1 t1 cross join
(select max(t2.sno) as max_sno from table_2 t2) t2
where not exists (select 1
from table_2 t2
where t2.person_id = t1.person_id
);
我并不真的推荐这种方法,除了作为一种变通方法。正确的方法是修复表
注:
- 使用简单的日期常量。这使用了
date
关键字,但您也可以使用'2020-01-01'::date
notexists
比notin
更可取,因为它处理NULL
值
- 整个
WHERE
子句不是防止重复的最佳方法。更好的方法是在冲突中使用(或者两者同时使用)
我在上一个问题中告诉过你不要在表格中使用图像。然而,您再次执行此操作…请显示表1的创建表
。表1中的SNO
和person\u id
之间有什么区别?Hi@VesaKarjalainen-对表进行了一些更改。你可以看到更新后的帖子。现在sno
列不在table_1
中table_1
是否有sno
列?table_2
中的sno
是否有序列或是串行列?这不是CREATE table
命令,也不是表1。这也不是表2,它有“性别”和/或“部门”吗?不要发布图片,发布有人可以复制粘贴的代码。我在上一个问题中告诉过你不要在表格中使用图片。然而,您再次执行此操作…请显示表1的创建表
。表1中的SNO
和person\u id
之间有什么区别?Hi@VesaKarjalainen-对表进行了一些更改。你可以看到更新后的帖子。现在sno
列不在table_1
中table_1
是否有sno
列?table_2
中的sno
是否有序列或是串行列?这不是CREATE table
命令,也不是表1。这也不是表2,它有“性别”和/或“部门”吗?不要发布图片,发布有人可以复制粘贴的代码。那会失败的SNO
是非空的
没有默认值
,您必须给它一个值。它与我在帖子中给出的代码有什么不同吗?@我发布的create table语句中的大检查。它会自动按顺序设置sno的值,而不会将其传递到insertOkay中,不幸的是,我无法使用create语句
。如果这是向表2插入新数据的唯一方法,那么这就可以了。如果还有其他插入新行的方法,我会使用触发器。这将失败SNO
是非空的
没有默认值
,您必须给它一个值。它与我在帖子中给出的代码有什么不同吗?@我发布的create table语句中的大检查。它会自动按顺序设置sno的值,而不会将其传递到insertOkay中,不幸的是,我无法使用create语句
。如果这是向表2插入新数据的唯一方法,那么这就可以了。如果还有其他方法插入新行,我会使用触发器。您好,谢谢您的回复。向上投票。但这会引发错误error:表“t2”的子句条目中缺少,但FROM子句存在
Hi,