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