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

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

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

11 ответов


использовать INSERT ... SELECT:

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

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

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

вам придется позаботиться о возможном повторе id из 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 в одной атомарной операции.

скажем, таблица user(id, user_name, user_email).

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

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

для быстрого, чистого решения, которое не требует, чтобы вы называли столбцы, вы можете использовать подготовленный оператор, как описано здесь: 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

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


это помогло, и он поддерживает столбцы 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;

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

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


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

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

Я нашел свой путь с 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);

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

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

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

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

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

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

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


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


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 */