Как скопировать строку и вставить в ту же таблицу с автоинкрементным полем в MySQL? - PullRequest
202 голосов
/ 06 февраля 2012

У меня есть таблица Eg- tab.Я пытаюсь скопировать строку с идентификатором столбца автоинкремента = 1 и вставить данные в ту же таблицу с идентификатором строки и столбца = 2.

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

Ответы [ 12 ]

304 голосов
/ 06 февраля 2012

Используйте 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во втором случае, конечно.

42 голосов
/ 12 октября 2012

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 за одну атомарную операцию.
14 голосов
/ 06 февраля 2012

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

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

INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)
9 голосов
/ 14 августа 2015

Это помогло и поддерживает столбцы 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;
7 голосов
/ 31 мая 2014

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

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

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

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

2 голосов
/ 30 марта 2019

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

-- 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
2 голосов
/ 15 мая 2015
insert into MyTable(field1, field2, id_backup)
    select field1, field2, uniqueId from MyTable where uniqueId = @Id;
2 голосов
/ 09 декабря 2013

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

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

0 голосов
/ 02 февраля 2018
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 */
0 голосов
/ 15 января 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...