我无法让这个看似简单的插入查询工作

时间:2011-10-05 20:47:21

标签: sql postgresql

人。我有一个查询,旨在从一个表中获取结果并将其插入另一个表。它看起来像这样:

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_deletedminutes中不存在的列中的列指定空值?

非常感谢你的帮助。

6 个答案:

答案 0 :(得分:7)

您的问题是您的目标和源表没有相同的列数据类型。

要解决此问题,请在您的目标和来源的列顺序中明确说明。

 INSERT INTO MyDestination ( Column1, Column2, Column3)
      SELECT ColumnA,
             ColumnB,
             ColumnC
      FROM   MySource;
  • ColumnA必须与Column1
  • 的类型相同
  • ColumnB必须与Column2
  • 的类型相同
  • ColumnC必须与Column3
  • 的类型相同

在您需要适合目的地时使用转换/转换。

答案 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。为此你可以插入'' - 两个单引号之间没有任何内容。