2010-05-06 153 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" 
相关问题