人。我有一个查询,旨在从一个表中获取结果并将其插入另一个表。它看起来像这样:
INSERT INTO minutes_deleted
SELECT * FROM minutes
WHERE minutes_id = 103
现在,我甚至不知道你可以尝试插入那样的东西。 (我认为插入语句都有语法INSERT INTO blah VALUES (some values)
,但在阅读手册后我发现你可以。
现在,问题是这会出错:column "meeting_id" is of type integer but expression is of type character varying
我认为发生此错误是因为minutes_deleted
中的列与minutes_id
中的列的顺序不同。
minutes_deleted
也有一些minutes
中找不到的列,但minutes
中的所有列都可以在minutes_deleted
中找到,但是会以混乱的顺序排列。
根据手册,表中包含填充内容的所有列(即minutes_deleted
)必须给出一个值,如果我可以通过列顺序,查询可能仍会因为那个。
所以,如果你愿意,可以提出两个简单的问题:
1) - 我如何重新排列列的顺序,所以它的工作原理
2) - 如何为minutes_deleted
中minutes
中不存在的列中的列指定空值?
非常感谢你的帮助。
答案 0 :(得分:7)
您的问题是您的目标和源表没有相同的列数据类型。
要解决此问题,请在您的目标和来源的列顺序中明确说明。
INSERT INTO MyDestination ( Column1, Column2, Column3)
SELECT ColumnA,
ColumnB,
ColumnC
FROM MySource;
在您需要适合目的地时使用转换/转换。
答案 1 :(得分:3)
每当我做这种插入时,我通常必须专门列出列,除非它们是完美的匹配:
INSERT INTO minutes_deleted (somecol1, somecol2, somecol3)
SELECT somecol1, somecol2, somecol3
FROM minutes
WHERE minutes_id = 103
答案 2 :(得分:1)
为了使用该语法,minutes和minutes_deleted必须以相同的顺序具有相同数量的相同类型的列。通过列出列,您最好更明确。它不会阻止你看到的错误,但它会使它更明显。
INSERT INTO minutes_deleted
(Col1, Col2, ..., ColN)
SELECT AnotherCol1, AnotherCol2, ..., AnotherColN
FROM minutes
WHERE minutes_id = 103
答案 3 :(得分:1)
INSERT INTO minutes_deleted(value1)
SELECT theValueToInsert FROM minutes
WHERE minutes_id = 103
请勿使用*。
答案 4 :(得分:1)
作为Joe Enos,但能够将某些列设置为不在第二个表中的数据:
INSERT INTO minutes_deleted (somecol1, somecol2, somecol3)
SELECT somecol1, somecol2, "static text" as somecol3
FROM minutes
WHERE minutes_id = 103
答案 5 :(得分:1)
回答你问题2)
INSERT INTO minutes_deleted (col_1, col_2,col_3, col_5) -- note the missing col4
SELECT col_a, col_b, col_c, col_e -- note the missing col_d
FROM minutes
WHERE minutes_id = 103;
您可以将列明确设置为NULL
,但INSERT
上有一种更简单的方式:
忽略 INSERT语句中的字段(如上所示),只要你没有定义它,它就会被设置为默认值NULL
。
准确地说,如果所讨论的列是字符串类型(如text
),则与“空值”最接近的是空字符串而不是NULL
。为此你可以插入''
- 两个单引号之间没有任何内容。