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

And*_*rew 176 mysql sql

我有很多行要复制,但我需要更改一个字段.

我可以选择要复制的行:

select * from Table where Event_ID = "120"
Run Code Online (Sandbox Code Playgroud)

现在我想复制所有这些行并在设置Event_IDto时创建新行155.我怎么能做到这一点?

dcp*_*dcp 253

INSERT INTO Table
          ( Event_ID
          , col2
           ...
          )
     SELECT "155"
          , col2
           ...
      FROM Table WHERE Event_ID = "120"
Run Code Online (Sandbox Code Playgroud)

这里,col2,...表示表中剩余的列(Event_ID 以外的列).

  • 有没有办法做到这一点,而无需指定列名? (32认同)
  • 不是我知道的.当然,如果你的表有1000列或类似的东西,并且你不想全部键入它们,那么你可以编写一个SQL语句来构建你的SQL语句:).你这样做的方法是使用information_schema来获取表的列名.但那真是太过分了,我只想输入列名. (4认同)
  • 是否可以使用星号来获取剩余的列? (3认同)
  • 登录进行投票只是为了发现我已经对此进行了投票。我想这为我节省了很多时间:)谢谢! (2认同)
  • @Bitterblue - 抱歉,我不明白你的评论。我从来没有说过 col2, ... 是您不想复制的列,我只是说它们代表表中的其余列。很明显,它们将被复制,否则,它们根本不会出现在 SQL 语句中。 (2认同)

Ale*_*lou 132

这是一个解决方案,您的表中有许多字段,并且不希望因为键入所有字段而导致手指抽筋,只需键入所需的字段:)

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

  1. 创建一个包含要复制的所有行的临时表
  2. 使用所需的值更新临时表中的所有行
  3. 如果您有自动增量字段,则应在临时表中将其设置为NULL
  4. 将临时表的所有行复制到原始表中
  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
Run Code Online (Sandbox Code Playgroud)

一般情景代码:

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
Run Code Online (Sandbox Code Playgroud)

简化/简化代码:

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;
Run Code Online (Sandbox Code Playgroud)

由于临时表的创建使用TEMPORARY关键字,因此会话结束时会自动删除(如@ ar34z建议的那样).

  • 这基本上对我来说非常合适,但我确实必须克服临时表中主键的Not Null约束,这些约束似乎是从原始表中复制的.我通过在更新之前更改临时表来修复此问题,如下所示:`ALTER TABLE temporary_table MODIFY <auto_inc_not_null_field> INT;`然后将主键更新为Null不会失败. (10认同)
  • MySQL支持`TEMPORARY`关键字来创建临时表.当会话(一系列SQL查询)完成时,`CREATE TEMPORARY TABLE`的使用将自动删除表.删除表是没有必要的,它不会与使用相同名称的其他临时表冲突.(例如,当活黑客时(我不建议)) (7认同)

Pet*_*ley 38

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

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, "155"
  FROM Table
 WHERE Event_ID = "120"
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法做到这一点,而无需指定列名? (4认同)

小智 10

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

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

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp
Run Code Online (Sandbox Code Playgroud)

  • 注意:这假设您的表中没有主键 (6认同)

小智 6

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

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, Event_ID+"155"
  FROM Table
 WHERE Event_ID = "120"
Run Code Online (Sandbox Code Playgroud)

??????????