MySQL:如何复制行,但更改几个字段?

时间:2010-05-06 17:33:46

标签: sql mysql

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

我可以选择要复制的行:

select * from Table where Event_ID = "120"

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

7 个答案:

答案 0 :(得分:229)

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

此处,col2,...表示表格中剩余的列( Event_ID除外)。

答案 1 :(得分:126)

这是一个解决方案,你的表中有很多字段,不想因为输入所有字段而引起手指抽筋,只需键入所需的字段:)

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

  1. 创建一个包含您要复制的所有行的临时表
  2. 使用您想要的值
  3. 更新临时表中的所有行
  4. 如果您有自动增量字段,则应在临时表
  5. 中将其设置为NULL
  6. 将临时表的所有行复制到原始表中
  7. 删除临时表
  8. 您的代码:

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

答案 2 :(得分:38)

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

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

答案 3 :(得分:10)

如果表中有大量列,并且不想输出每个列,则可以使用临时表来执行此操作,例如;

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

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp

答案 4 :(得分:1)

嘿如何复制所有字段,将其中一个字段更改为相同的值+其他字段。

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

____

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

添加@DaveTheBFG 的答案: 如果您有标识列(以下示例中的“Table_PK”),则 INSERT 行将失败,但您可以执行以下操作(特定于 SQL Server,但该概念可能适用于其他数据库):

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

UPDATE #TEMP
SET Column = "Changed"

ALTER TABLE #TEMP DROP COLUMN Table_PK

EXEC sp_executesql N'INSERT INTO Table SELECT * FROM #Temp'