MySQL: Как скопировать строки, но изменить несколько полей?

У меня есть большое количество строк, которые я хотел бы скопировать, но мне нужно изменить одно поле.

Я могу выбрать строки, которые я хочу скопировать:

select * from Table where Event_ID = "120"

Теперь я хочу скопировать все эти строки и создать новые строки, установив Event_ID в 155. Как я могу это сделать?

Ответ 1

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

Здесь col2,... представляют остальные столбцы (те , кроме Event_ID) в вашей таблице.

Ответ 2

Это решение, в котором у вас много полей в таблице, и вы не хотите, чтобы у вас была ошибка при вводе всех полей, просто введите нужные теги:)

Как скопировать некоторые строки в одну и ту же таблицу, причем некоторые поля имеют разные значения:

  • Создайте временную таблицу со всеми строками, которые вы хотите скопировать.
  • Обновить все строки во временной таблице со значениями, которые вы хотите
  • Если у вас есть поле автоматического приращения, вы должны установить его в 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).

Ответ 3

Скажем, ваша таблица имеет два других столбца: foo и bar

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

Ответ 4

Если у вас много столбцов в таблице и вы не хотите вводить их, вы можете сделать это, используя временную таблицу, например:

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

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp

Ответ 5

Эй, как скопировать все поля, изменить одно из них на одно и то же значение + что-то еще.

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

??????????

Ответ 6

Пока Event_ID является Integer, сделайте следующее:

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