2010-05-06 122 views
140

我有大量的行我想複製,但我需要更改一個字段。MySQL:如何複製行,但改變幾個字段?

我可以選擇,我要複製的行:

select * from Table where Event_ID = "120" 

現在我想複製所有的行,同時設置Event_ID155創建新行。我怎樣才能做到這一點?

回答

192
INSERT INTO Table 
      (Event_ID 
      , col2 
      ... 
     ) 
    SELECT "155" 
      , col2 
      ... 
     FROM Table WHERE Event_ID = "120" 

這裏,COL2,......代表其餘的列(那些比 EVENT_ID 等)在表格中。

+19

有沒有辦法做到這一點,而不必指定列名? – Andrew 2010-05-06 18:00:24

+3

不是我所知道的。當然,如果你的表有1000列或其他東西,而你不想全部輸入,那麼你可以編寫一個SQL語句來構建你的SQL語句:)。你會這樣做的方式是使用information_schema來獲取表的列名。但是這真是太過分了,我只是輸入列名。 – dcp 2010-05-06 18:21:10

+1

正是我需要的例子,謝謝。我不確定你是否可以這樣做。 – salonMonsters 2010-11-29 20:35:05

33

比方說,你的表有另外兩列:Foo和Bar

INSERT INTO Table (foo, bar, Event_ID) 
SELECT foo, bar, "155" 
    FROM Table 
WHERE Event_ID = "120" 
+4

有沒有辦法做到這一點,而不必指定列名? – Andrew 2010-05-06 18:00:06

+0

謝謝!你的解決方案爲我做了。 :) – Woppi 2014-05-29 02:21:37

+0

很好的例子,簡短的甜蜜和完整! – 2014-10-02 19:56:15

2

嘿怎麼樣複製各個領域,改變其中的一個相同的值+別的東西。

INSERT INTO Table (foo, bar, Event_ID) 
SELECT foo, bar, Event_ID+"155" 
    FROM Table 
WHERE Event_ID = "120" 

??????????

9

如果你的表中有許多列並且不想輸出每一列,你可以使用臨時表來完成它,比如;

SELECT * 
INTO #Temp 
FROM Table WHERE Event_ID = "120" 
GO 

UPDATE #TEMP 
SET Column = "Changed" 
GO 

INSERT INTO Table 
SELECT * 
FROM #Temp 
+5

注:假設你的表中沒有主鍵 – kommradHomer 2014-07-25 07:33:11

105

這就是你有很多領域在你的桌子和不想打字的所有領域得到了手指抽筋,只需鍵入所需的人:)

如何複製解決方案一些行到相同的表,具有不同價值觀的某些字段:

  1. 所有你想在顳複製
  2. 更新所有行的行創建臨時表你想
  3. 如果你有一個自動遞增字段,你應該把它設置爲NULL在臨時表
  4. 臨時表中的所有行復制到原始表中的值RY表
  5. 刪除臨時表

您的代碼:

CREATE table temporary_table AS SELECT * FROM original_table WHERE Event_ID="155"; 

UPDATE temporary_table SET Event_ID="120"; 

UPDATE temporary_table SET ID=NULL 

INSERT INTO original_table SELECT * FROM temporary_table; 

DROP TABLE temporary_table 

一般場景代碼:

CREATE table temporary_table AS SELECT * FROM original_table WHERE <conditions>; 

UPDATE temporary_table SET <fieldx>=<valuex>, <fieldy>=<valuey>, ...; 

UPDATE temporary_table SET <auto_inc_field>=NULL; 

INSERT INTO original_table SELECT * FROM temporary_table; 

DROP TABLE temporary_table 

簡體/冷凝代碼:

CREATE TEMPORARY TABLE temporary_table AS SELECT * FROM original_table WHERE <conditions>; 

UPDATE temporary_table SET <auto_inc_field>=NULL, <fieldx>=<valuex>, <fieldy>=<valuey>, ...; 

INSERT INTO original_table SELECT * FROM temporary_table; 

作爲創建臨時表的使用TEMPORARY關鍵字當會話結束(如@ ar34z建議的)將被自動刪除。

+0

謝謝Alex。此代碼爲我工作。 – TecBrat 2013-08-06 15:49:08

+6

MySQL支持'TEMPORARY'關鍵字來創建臨時表。當會話(一系列SQL查詢)完成時,使用CREATE TEMPORARY TABLE會自動刪除表。刪除表並不是必需的,它不會與其他使用相同名稱的臨時表發生衝突。 (例如,當實時黑客(我不會推薦)) – ar34z 2014-08-13 08:52:00

+1

此代碼僅適用於用戶#temporary_table而不是temporary_table,可能是MSSQL問題? – TruthOf42 2014-12-18 18:23:19

0

只要EVENT_ID是整數,這樣做:

INSERT INTO Table (foo, bar, Event_ID) 
SELECT foo, bar, (Event_ID + 155) 
    FROM Table 
WHERE Event_ID = "120"