2013-03-06 67 views
0

我有一個臨時表從xml讀取器填充,然後替換爲我的網站的最終生產表。現在列匹配,但我想添加一列到生產表中,將被手動更新,並且當我們從臨時表更新時不會覆蓋。MySQL插入表和列

例: 臨時表中的列:

Name 
Address 
Phone 

生產表有:

Name 
Address 
Phone 
Date 

目前我使用:

REPLACE INTO Tdata select * from temp_Tdata; 

我怎麼把它拉在數據從臨時表中不更改當前日期列。這些表格有超過25列,所以如果可以的話,我不希望列出所有的列名。

感謝您的幫助。

UPDATE

REPLACE INTO Tdata (Name, Address, Phone) select (Name, Address, Phone) from temp_Tdata; 

不起作用,因爲日期列被重置爲默認值,即失去了它所做的任何手動更改。

回答

1

UPDATE變通方法REPLACE

REPLACE INTO Tdata (Name, Address, Phone, Date) 
SELECT tt.Name, tt.Address, tt.Phone, t.Date 
    FROM temp_Tdata tt LEFT JOIN 
     Tdata t ON tt.Name = t.Name; 

sqlfiddle

現在,您可以創建帶來日期列臨時數據

CREATE VIEW vw_temp_Tdata 
AS 
SELECT tt.Name, tt.Address, tt.Phone, t.Date 
    FROM temp_Tdata tt LEFT JOIN 
     Tdata t ON tt.Name = t.Name; 

,然後用它像這樣的觀點

REPLACE INTO Tdata 
SELECT * FROM vw_temp_Tdata; 

sqlfiddle

原來的答覆被刪除,因爲它不會與REPLACE工作。

+0

有沒有辦法做到這一點,而不必列出目標表的所有25 +列名? – EricImprint 2013-03-06 21:33:41

+0

@EricImprint查看已更新的答案 – peterm 2013-03-06 21:39:19

+0

當命名兩個表中的列時,我得到 操作數應該包含1列錯誤1241 – EricImprint 2013-03-06 21:42:27

1
UPDATE Tdata 
SET Name = temp_TData.Name, 
Address = temp_Tdata.Address, 
Phone = temp_TData.Phone 
WHERE Tdata.Name = temp_Tdata.Name 
+0

有沒有辦法做到這一點,而不必列出目標表的所有25 +列名? – EricImprint 2013-03-06 21:33:08

+1

在SQL Server Management Studio中,您可以將「對象資源管理器」中的所有列名拖放到查詢窗口中,因此您不必輸入所有列名稱。我不知道MySQL是否具有類似的功能,但它可能值得作爲另一個問題在Stackoverflow – Melanie 2013-03-06 21:52:59

+0

它重寫日期列... http://sqlfiddle.com/#!2/467f7/1/ 0 – EricImprint 2013-03-06 22:10:24

0

如果我理解正確的話,你需要:

  1. 從原始表中添加列到目標表
  2. 插入數據(其具有比目標表有更多的列

如果是這樣,那麼你需要改變目的地表更新它:

ALTER TABLE Tdata 
    ADD COLUMN newColumn Varchar(50); -- Just an example 

然後你就可以更新(或插入)的數據。

+0

我已經添加了列。 – EricImprint 2013-03-06 21:32:35