Как скопировать строку и вставить в ту же таблицу с полем автоинкремента в MySQL?

У меня есть таблица Eg-tab. То, что я пытаюсь сделать, это копирование строки с автоинкрементным столбцом ID = 1 и вставка данных в одну таблицу с идентификатором строки и столбца = 2.

Использование MySql. Как я могу сделать это в одном запросе? Пожалуйста, помогите

Ответ 1

Используйте INSERT ... SELECT:

insert into your_table (c1, c2, ...)
select c1, c2, ...
from your_table
where id = 1

где c1, c2, ... - все столбцы, кроме id. Если вы хотите явно вставить с помощью id из 2, включите это в список столбцов INSERT и ваш SELECT:

insert into your_table (id, c1, c2, ...)
select 2, c1, c2, ...
from your_table
where id = 1

Вам нужно будет позаботиться о возможном дублировании id из 2 во втором случае, конечно.

Ответ 2

IMO, лучше всего использовать операторы sql только для копирования этой строки, в то же время ссылаясь только на столбцы, которые вы должны и хотите изменить.

CREATE TEMPORARY TABLE temp_table ENGINE=MEMORY

SELECT * FROM your_table WHERE id=1;
UPDATE temp_table SET id=NULL; /* Update other values at will. */

INSERT INTO your_table SELECT * FROM temp_table;
DROP TABLE temp_table;

См. также av8n.com - Как клонировать запись SQL

Преимущества:

  • В операциях SQL 2 упоминаются только те поля, которые необходимо изменить во время процесса клонирования. Они не знают о других областях или заботятся о них. Остальные поля просто идут на прогулку, без изменений. Это упрощает работу с инструкциями SQL, их легче читать, упрощать и расширять.
  • Используются только обычные операторы MySQL. Никаких других инструментов или языков программирования не требуется.
  • Полностью правильная запись вставляется в your_table в одну атомную операцию.

Ответ 3

Скажите, что таблица user(id, user_name, user_email).

Вы можете использовать этот запрос:

INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)

Ответ 4

Это помогло и поддерживает столбцы BLOB/TEXT.

CREATE TEMPORARY TABLE temp_table
AS
SELECT * FROM source_table WHERE id=2;
UPDATE temp_table SET id=NULL WHERE id=2;
INSERT INTO source_table SELECT * FROM temp_table;
DROP TEMPORARY TABLE temp_table;
USE source_table;

Ответ 5

Для быстрого, чистого решения, которое не требует, чтобы вы называли столбцы, вы можете использовать подготовленный оператор, как описано здесь: fooobar.com/questions/40368/...

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

DELIMITER $$

CREATE PROCEDURE `duplicateRows`(_schemaName text, _tableName text, _whereClause text, _omitColumns text)
SQL SECURITY INVOKER
BEGIN
  SELECT IF(TRIM(_omitColumns) <> '', CONCAT('id', ',', TRIM(_omitColumns)), 'id') INTO @omitColumns;

  SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns 
  WHERE table_schema = _schemaName AND table_name = _tableName AND FIND_IN_SET(COLUMN_NAME,@omitColumns) = 0 ORDER BY ORDINAL_POSITION INTO @columns;

  SET @sql = CONCAT('INSERT INTO ', _tableName, '(', @columns, ')',
  'SELECT ', @columns, 
  ' FROM ', _schemaName, '.', _tableName, ' ',  _whereClause);

  PREPARE stmt1 FROM @sql;
  EXECUTE stmt1;
END

Вы можете запустить его с помощью:

CALL duplicateRows('database', 'table', 'WHERE condition = optional', 'omit_columns_optional');

Примеры

duplicateRows('acl', 'users', 'WHERE id = 200'); -- will duplicate the row for the user with id 200
duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts'); -- same as above but will not copy the created_ts column value    
duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts,updated_ts'); -- same as above but also omits the updated_ts column
duplicateRows('acl', 'users'); -- will duplicate all records in the table

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это решение предназначено только для тех, кто будет неоднократно дублировать строки во многих таблицах, часто. Это может быть опасно в руках пользователя-изгоев.

Ответ 6

Вы также можете передать "0" в качестве значения для автоматического увеличения числа столбцов, правильное значение будет использоваться при создании записи. Это намного проще, чем временные таблицы.

Источник: Копирование строк в MySQL (см. второй комментарий от TRiG к первому решению, Lore)

Ответ 7

insert into MyTable(field1, field2, id_backup)
    select field1, field2, uniqueId from MyTable where uniqueId = @Id;

Ответ 8

Здесь много отличных ответов. Ниже приведен пример хранимой процедуры, которую я написал для выполнения этой задачи для разрабатываемого веб-приложения:

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON

-- Create Temporary Table
SELECT * INTO #tempTable FROM <YourTable> WHERE Id = Id

--To trigger the auto increment
UPDATE #tempTable SET Id = NULL 

--Update new data row in #tempTable here!

--Insert duplicate row with modified data back into your table
INSERT INTO <YourTable> SELECT * FROM #tempTable

-- Drop Temporary Table
DROP TABLE #tempTable

Ответ 9

Я искал одну и ту же функцию, но я не использую MySQL. Я хотел скопировать ВСЕ поля, кроме, конечно, первичного ключа (id). Это был запрос с одним выстрелом, который нельзя использовать ни в каком script или коде.

Я нашел свой путь с PL/SQL, но я уверен, что любая другая SQL IDE будет делать. Я сделал базовый

SELECT * 
FROM mytable 
WHERE id=42;

Затем экспортируйте его в файл SQL, где я могу найти

INSERT INTO table (col1, col2, col3, ... , col42) 
VALUES (1, 2, 3, ..., 42);

Я только что отредактировал его и использовал его:

INSERT INTO table (col1, col2, col3, ... , col42) 
VALUES (mysequence.nextval, 2, 3, ..., 42);

Ответ 10

Я склонен использовать вариацию того, что mu слишком коротко опубликовано:

INSERT INTO something_log
SELECT NULL, s.*
FROM something AS s
WHERE s.id = 1;

Пока таблицы имеют одинаковые поля (за исключением автоматического приращения в таблице журналов), это хорошо работает.

Так как я использую хранимые процедуры, когда это возможно (чтобы облегчить жизнь другим программистам, которые не слишком знакомы с базами данных), это решает проблему возврата и обновления процедур каждый раз, когда вы добавляете новое поле в таблицу.

Он также гарантирует, что если вы добавите новые поля в таблицу, они сразу начнут появляться в таблице журналов, не обновляя ваши запросы к базе данных (если, конечно, у вас нет некоторых, которые задают поле явно)

Предупреждение:. Вы должны обязательно добавить любые новые поля в обе таблицы одновременно, чтобы порядок полей остался прежним... иначе вы начнете получать нечетные ошибки. Если вы единственный, кто пишет интерфейсы баз данных, и вы очень осторожны, то это работает хорошо. В противном случае, придерживайтесь названия всех ваших полей.

Примечание.. Во-вторых, если вы не работаете над сольным проектом, который, как вы уверены, не будет иметь других, работающих на нем, не будет явно указывать все имена полей и обновлять ваши записи журнала как ваши изменения схемы. Этот ярлык, вероятно, не стоит долговременной головной боли, которую он может вызвать... особенно в производственной системе.

Ответ 11

INSERT INTO 'dbMyDataBase'.'tblMyTable' 
(
    'IdAutoincrement', 
    'Column2', 
    'Column3', 
    'Column4' 
) 

SELECT 
    NULL,  
    'Column2', 
    'Column3', 
    'CustomValue' AS Column4 
FROM 'dbMyDataBase'.'tblMyTable' 
WHERE 'tblMyTable'.'Column2' = 'UniqueValueOfTheKey' 
; 
/* mySQL 5.6 */

Ответ 12

Если вы можете использовать MySQL Workbench, вы можете сделать это, щелкнув правой кнопкой мыши строку и выбрав "Копировать строку", затем щелкнув правой кнопкой мыши пустую строку и выбрав "Вставить строку", затем изменив идентификатор, а затем нажмите "Применить".

Скопируйте строку:

enter image description here

Вставьте скопированную строку в пустую строку:

enter image description here

Изменить идентификатор:

enter image description here

Применение:

enter image description here

Ответ 13

Дамп строки, которую вы хотите sql, а затем используйте сгенерированный SQL, за исключением столбца ID, чтобы импортировать его обратно.