Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在基于select-Postgres的插入过程中继续序列号_Sql_Postgresql_Select_Insert_Where Clause - Fatal编程技术网

Sql 如何在基于select-Postgres的插入过程中继续序列号

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

我正在使用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" 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,