Postgres查询错误

11

我在Postgres中有一个查询

insert into c_d (select * from cd where ak = '22019763');

我收到以下错误消息:

ERROR:  column "region" is of type integer but expression is of type character varying
HINT:  You will need to rewrite or cast the expression.

4
你确定 c_d 和 cd 表具有相同的字段顺序吗?否则请在查询中明确指出这些字段。 - Michael Buen
c_d表中的字段比cd表中的字段多。还有其他的做法吗? - Elitmiar
2个回答

17
一个INSERT INTO table1 SELECT * FROM table2完全取决于列的顺序,这是表定义的一部分。它将把table1的每一列与table2的具有相同order值的列对齐,而不考虑名称。
你在这里遇到的问题是,与"region"表中c_d具有相同顺序值的cd中的任何列都具有不兼容的类型,并且隐式类型转换无法消除混乱。 INSERT INTO SELECT *语句在风格上是不好的形式,除非两个表被定义,并且永远被定义为完全相同的方式。只需要增加一个额外的列到cd中,您就会开始收到有关多余额外列的错误信息。
如果可能的话,我建议在SELECT语句中显式调用列。您可以调用函数来更改每个列引用中的类型(或者可以定义一个新的类型转换来隐式执行此操作--请参见CREATE CAST),并且您可以使用AS将列标签设置为与目标列匹配。
如果由于某种原因无法执行此操作,请在问题中指出。

1
进一步澄清,以下是如何在这样的语句中描述列名(Postgres,从另一个表复制行到表中):INSERT INTO tablename (col1, col2, col3) SELECT * FROM ... - hamx0r
仅供帮助,假如你真的需要这么做:EXCEPT SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_catalog = 'my_db' AND table_name = 'table2';``` 这将会给出table1中不在table2中的列名。别忘了反过来运行。 添加这些列到每个表中,以使得所有列都相同。我有一个拥有900多个列的表格,这个方法对我太有帮助了。 - Noah Gary

1

请查看PostgreSQL的插入文档。语法如下:

INSERT INTO table [ ( column [, ...] ) ]
{ DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) | query }

这里看起来会是这样的:

INSERT INTO c_d (column1, column2...) select * from cd where ak = '22019763'

这是在将一个表中的值插入到另一个表中时使用的语法,其中列类型和顺序不完全相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接