我在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.
答案 0 :(得分:8)
INSERT INTO table1 SELECT * FROM table2
完全取决于列的 order ,这是表定义的一部分。无论名称如何,它都会将table1的每一列与table2的列相对应,具有相同的 order 值。
你遇到的问题是来自cd的具有相同订单值的列与“region”表的c_d具有不兼容的类型,并且隐式类型转换不可用于清除混淆。
INSERT INTO SELECT *
语句在风格上是不好的形式,除非定义了两个表,并且将永远以相同的方式定义完全。只需将一个额外的列添加到cd中,您就会开始收到有关额外列的无关错误。
如果可能的话,我建议明确地在SELECT
语句中调用列。您可以调用一个函数来更改每个列引用中的类型(或者您可以定义一个新的类型转换来隐式执行此操作 - 请参阅CREATE CAST
),您可以使用AS
来设置列标签以匹配目标列的标签。
如果由于某种原因无法执行此操作,请在您的问题中注明。
答案 1 :(得分:1)
查看PostgreSQL insert documentation.语法为:
INSERT INTO table [ ( column [, ...] ) ]
{ DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) | query }
这里看起来像:
INSERT INTO c_d (column1, column2...) select * from cd where ak = '22019763'
这是在将值从一个表插入另一个表时要使用的语法,其中列类型和顺序不完全相同。