我有大量的行,我想复制,但我需要改变一个字段。

我可以选择我想要复制的行:

select * from Table where Event_ID = "120"

现在我想复制所有这些行并创建新行,同时将Event_ID设置为155。我怎样才能做到呢?


当前回答

如果你的表中有很多列,你不想把每一列都打出来,你可以用一个临时表来做,比如;

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

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp

其他回答

只要Event_ID为Integer,执行以下操作:

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

假设你的表有另外两列:foo和bar

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

如果你的表中有很多列,你不想把每一列都打出来,你可以用一个临时表来做,比如;

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

UPDATE #TEMP
SET Column = "Changed"
GO

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

这里,col2,…表示表中剩下的列(Event_ID以外的列)。

这是一个解决方案,你在你的表中有很多字段,不想从输入所有字段中得到一个手指抽筋,只输入需要的:)

如何将一些行复制到同一个表中,其中一些字段具有不同的值:

创建一个包含要复制的所有行的临时表 用所需的值更新临时表中的所有行 如果您有一个自动递增字段,您应该在临时表中将其设置为NULL 将临时表的所有行复制到原始表中 删除临时表

你的代码:

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所建议的那样)。