2011-10-05 28 views
0

夥計們。我有一個查詢是爲了從一個表中獲取結果並將其插入到另一個表中。它看起來像這樣:我不能看到這個看似簡單的插入查詢工作

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_deleted不同的順序比minutes_id的人。也有未在minutes發現了一些列,但在minutes所有列在minutes_deleted發現,雖然在一個混亂的秩序。

按照手冊,所有的th列表中填充了東西的e列(即, minutes_deleted必須給出一個值,如果我可以通過列順序,查詢可能會因此而失敗。

所以,如果你將在兩個簡單的問題:我要如何

1)去重新排列列的順序,所以它的工作原理。
2) - 如何在minutes_deleted中爲minutes中不存在的列指定空值?

非常感謝您的幫助。

+0

**如果僅列出每張表的列,**會不會更快?**好像在SO上輸入一個問題只是爲了弄清楚這是浪費時間。最好的做法是始終輸入「插入」的列,而不要選擇「*」。 –

回答

7

您的問題是您的目標和源表不具有相同順序的相同列數據類型。

要解決此問題,請在您的目標和來源的列順序中明確指出。

INSERT INTO MyDestination (Column1, Column2, Column3) 
     SELECT ColumnA, 
      ColumnB, 
      ColumnC 
     FROM MySource; 
  • ColumnA必須是同一類型列1
  • ColumnB必須是同一類型列2
  • ColumnC必須是同一類型欄3

錄用鑄造/轉換,因爲你需要適合目的地。

+0

這似乎是一個好主意,但是呃,這樣做的語法是什麼?是的,我只是去'SELECT column1,column3,column2 ... FROM..' – zermy

+1

+1這是一個很差的做法,永遠做一個插入而不明確指定列。 – HLGEM

+0

如果數據類型不同,您可能需要專門將它們轉換爲語句的selct部分中的正確數據類型。如果他們不會投射,那麼您將遇到數據問題,即源表中的數據無法與目標表中的數據類型一起使用,並且您需要查找並修復這些不良數據。 – HLGEM

1

爲了使用該語法,minutes和minutes_deleted必須具有相同數量的相同列數的相同類型的相同順序。您最好通過列出列來更加明確。它不會阻止你看到的錯誤,但它會使它更明顯。

INSERT INTO minutes_deleted 
    (Col1, Col2, ..., ColN) 
    SELECT AnotherCol1, AnotherCol2, ..., AnotherColN 
     FROM minutes 
     WHERE minutes_id = 103 
3

每當我做這樣的插入,我一般都明確列出列,除非他們是完美的比賽:

INSERT INTO minutes_deleted (somecol1, somecol2, somecol3) 
    SELECT somecol1, somecol2, somecol3 
    FROM minutes 
    WHERE minutes_id = 103 
1
INSERT INTO minutes_deleted(value1) 
SELECT theValueToInsert FROM minutes 
WHERE minutes_id = 103 

不要使用*。

1

喬伊諾斯,但在第二個表中設置一些列的數據不是能力:

INSERT INTO minutes_deleted (somecol1, somecol2, somecol3) 
SELECT somecol1, somecol2, "static text" as somecol3 
FROM minutes 
WHERE minutes_id = 103 
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。爲此,您可以插入'' - 兩個單引號,其間沒有任何內容。

相關問題