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"