当前位置: 首页 > 知识库问答 >
问题:

POSTGRESQL:插入...选择自动生成的列

桂嘉年
2023-03-14

我有两个表A(id,col1,col2)和B(col3,col4,col5,col6)

INSERT INTO A(col1, col2)
(SELECT col3, col4 from B)
ERROR:  null value in column "id" violates not-null constraint
DETAIL: Failing row contains (null, "abc", "def")
INSERT INTO A(id, col1, col2)
(SELECT DEFAULT, col3, col4 from B)

这引发错误

ERROR:  syntax error at or near "DEFAULT"

为什么postgres不自动为列“id”生成值?如果我从表B中提供“id”,或者如果我插入单行(没有select)并为自动生成的列提供“default”关键字,查询就可以工作。

编辑:表创建查询

CREATE TABLE A 
(
id bigint NOT NULL, 
col1 character varying(10), 
col2 character varying(10), 
CONSTRAINT A_pk PRIMARY KEY (id) 
); 
ALTER TABLE A OWNER TO user1; 

CREATE SEQUENCE A_id_seq 
START WITH 1 
INCREMENT BY 1 
NO MINVALUE 
NO MAXVALUE 
CACHE 1; 

ALTER TABLE A_id_seq OWNER TO user1; 

ALTER SEQUENCE A_id_seq OWNED BY A.id; 

共有1个答案

文志学
2023-03-14
INSERT INTO A(col1, col2)
(SELECT col3, col4 from B)

失败,因为没有为ID设置默认值。默认值应该是从序列中取nextval。

CREATE SEQUENCE A_id_seq 
  START WITH 1 
  INCREMENT BY 1 
  NO MINVALUE 
  NO MAXVALUE 
  CACHE 1; 

CREATE TABLE A 
(
  id bigint NOT NULL DEFAULT nextval('A_id_seq'::regclass), 
  col1 character varying(10), 
  col2 character varying(10), 
  CONSTRAINT A_pk PRIMARY KEY (id) 
); 

或者,您可以在创建表中使用bigserial而不是bigint,以便为您创建序列并自动设置默认设置。最终结果是一样的。

 类似资料:
  • 问题内容: 我想从行插入中检索自动生成的ID,但得到一个 这是代码: 这是PostgreSQL表: PostgreSQL支持自动生成的密钥,但是我得到了这个异常: 编辑:我试图这样做以获得自动生成的密钥: 但我得到了: ,虽然我认为 应该在插入行时调用 编辑: 插入行时正确创建了自动增量值 任何想法 ? 问题答案: 请注意,在较新版本的Postgres中,您需要使用 代替

  • 我想从行插入中检索自动生成的id,但得到的是 PostgreSQL支持自动生成的密钥,但我得到了这个异常: 编辑:我尝试了此操作以获取自动生成的密钥: 但我得到一个: 插入行时会正确创建自动递增值 知道吗?

  • 问题内容: 以下代码应将数组中的每个键值对插入到表中的数学列值中。该脚本不返回错误,但插入的行仅包含数组中的最后一个值 例如 将行成功插入到具有第一,第二和第三列的表中,但总共插入值3。 问题答案: 忘记了,只需使用并传递以下值: 另外,您可以完全擦除命名参数,以简化代码:

  • 问题内容: 如何检索刚插入的行? 例如: 我插入了2,返回了2 然后插入3,我想返回3而不是5行。 提前致谢。 史蒂夫 PS:可能需要使用存储过程吗? 问题答案: 我不是100%不确定您到底想要什么…。但是SQL Server有一个子句可以从and和statement中输出内容: 在这里,您正在插入值和的插入值(例如INT IDENTITY列)和。 如果仅将结果返回到Mgmt Studio中的网格

  • 问题内容: 我有以下问题。我的表格()结构如下: 存储不同表的名称,并在这些表中存储ID。我想做的是检查上述表中的行是否存储了对其他表的有效引用。因此,我需要从外部表中选择一行,其名称基于存储在中的字符串。我的代码不起作用,因为它存在语法错误,但清楚地显示了我想要实现的目标: 问题答案: 如果知道所有可能的表名,则可以使用条件语法来实现它:

  • 本文向大家介绍Python随机生成数据后插入到PostgreSQL,包括了Python随机生成数据后插入到PostgreSQL的使用技巧和注意事项,需要的朋友参考一下 用Python随机生成学生姓名,三科成绩和班级数据,再插入到PostgreSQL中。 模块用psycopg2 random 以上就是利用Python随机生成数据后插入到PostgreSQL数据库中的全部内容,希望给大家学习Pytho